Java (Rhino JavaScript) Sortier Funktion liefert komische Ergebnisse

domidragon

Fleet Admiral
Registriert
Juli 2008
Beiträge
11.532
Huhu

Ich erhalte von der sort() Funktion eine falsche Sortierung und ich sehe den Fehler nicht, wieso diese die Werte so sortiert. Es macht schlicht kein Sinn. Vielleicht seht ihr ja was, was ich nicht sehe. Danke.

Ich habe es in verschiedenen Varianten getestet. Ich will einen String, der davor ein TimeStamp hat, zeitlich sortieren. (Ich kann diese Daten leider nicht anders bekommen.)

Der String sieht ungefähr wie folgt aus (es handelt sich um Logeinträge)
23.12.2014 / 16:44:08 _Test_This is a test error message

(Datum / Zeit _Modul_Message)

Ich extrahiere aus dem String das Datum und die Zeit. (Format ist immer gleich, daher leicht machbar)

Dann habe ich ein Array voll mit Date Objekten (https://docs.oracle.com/javase/6/docs/api/java/util/Date.html). Dieses Objekt bietet z.B. die Möglichkeit mit .getTime() das Datum/Zeit in Millisekunden zu bekommen.
Code:
dataArray[0].getTime()
1419349446000

Nun folgendes Problem. Wenn ich in einen Array nur die Millisekunden aller TimeStamps schreibe und dieses per .sort() sortieren lasse:
Code:
msArray.sort(function (a, b) { a - b});

ist das Array danach sauber abwärts sortiert wie ich es will.

Nun wird aber die Zuweisung der Message schwierig, daher habe ich mir gedacht, ich erweitere die Funktion.

Code:
dataArray.push({
                date: dateObj,
                originalMsg: messageString,
            });
Befülle das Array mit einem Objekt, welches beide Werte kennt.

Wenn ich nun wieder sortieren will:
Code:
dataArray.sort(function (a, b) { a.date.getTime() - b.date.getTime() });

Bekomme ich eine willkürliche Sortierung, die keinen sinn macht. Hier die Ausgabe:
Code:
% dataArray[0].date.getTime()
1419349446000
% dataArray[1].date.getTime()
1419349448000
% dataArray[2].date.getTime()
1419349453000
% dataArray[3].date.getTime()
1419349442000
% dataArray[4].date.getTime()
1419349447000
% dataArray[5].date.getTime()
1419349452000
% dataArray[6].date.getTime()
1419349447000
% dataArray[7].date.getTime()
1419349448000
% dataArray[8].date.getTime()
1419349445000

Habe ich irgendwo einen Denkfehler? Das müsste doch so funktionieren?
Habt ihr evtl. einfachere Lösungen?

Grüsse
Domi
 
Zuletzt bearbeitet:
Also meiner Meinung nach fehlt 'return' in deinen funktionen. (Gerade getestet auf FF - er gibt nicht (wie in manch anderen Programmiersprachen der Fall) den Wert der letzten Expression als default zurück sondern immer undefined). Vermutlich hat dein 1. Beispiel nur deshalb funktioniert weil er Aufgrund des undefined Ergebnisses dann doch wieder 'natürlich' sortiert hat.
 
Ich muss noch hinzufügen, dass ich das direkt im Debugger eingegeben habe :) Funktion war auf das .sort(function... ) bezogen. Entschuldige die verwirrung. :)

Die sachen sind nicht in einer Funktion/Methode wie man es kennt, sind alle Zeilen untereinander, wenn man so will. Da brauchst kein Return oder ähnliches.

Daher finde ich es ja so sinnlos, was ich als Ergebnis erhalte. oO
 
Deine Sortfunktion sollte aber schon einen return wert haben ;)
 
Hat sie auch, aber da kommt nur [object] zurück, weil er es nicht ausschreibt. Die Rhino Engine hat so seine Macken^^
 
Zurück
Oben