Map (Key=String; Value = Vector) Value/Vector sortieren

Todesbote

Mitglied
Hallo zusammen!

Ich habe eine Map in der ich zu einem bestimmten Key (serialNr) einen Vector als Value habe.
Da ich nun mehrere Werte in diesem Vector gespeichert habe (auch verschiedene Datentypen int, String, Date) möchte ich den Vector sortieren.
Es soll nach der Uhrzeit (Date (mit SimpleDateFormat)) sortiert werden.
Laut Google kann ich die Sortierung mit einem Comperator machen.
Allerdings habe ich nach längerer Suche noch keine Lösung für mein Problem gefunden wie ich den Vector aufrufen kann und nach der Uhrzeit sortieren kann.

2 Files die Komponenten mit dem gleichen Key enthalten und somit in dem selben Vector gespeichert werden.

File 1:

LogEintrag [stationsnummer=0, status=freigegeben, uhrzeit=Mon Feb 06 16:22:38 CET 2012,

LogEintrag [stationsnummer=0, status=Update, uhrzeit=Fri Jul 27 01:16:24
CEST 2012,

File 2:

LogEintrag [stationsnummer=0, status=freigegeben, uhrzeit=Mon Feb 06 17:22:38 CET 2012,

LogEintrag [stationsnummer=0, status=Update, uhrzeit=Fri Jul 27 02:16:24 CEST 2012,


Ausgabe bisher:
LogEintrag [stationsnummer=0, status=freigegeben, uhrzeit=Mon Feb 06 16:22:38 CET 2012,

LogEintrag [stationsnummer=0, status=Update, uhrzeit=Fri Jul 27 01:16:24
CEST 2012,

LogEintrag [stationsnummer=0, status=freigegeben, uhrzeit=Mon Feb 06 17:22:38 CET 2012,

LogEintrag [stationsnummer=0, status=Update, uhrzeit=Fri Jul 27 02:16:24 CEST 2012,


Soll-Ausgabe:
LogEintrag [stationsnummer=0, status=freigegeben, uhrzeit=Mon Feb 06 16:22:38 CET 2012,

LogEintrag [stationsnummer=0, status=freigegeben, uhrzeit=Mon Feb 06 17:22:38 CET 2012,

LogEintrag [stationsnummer=0, status=Update, uhrzeit=Fri Jul 27 01:16:24
CEST 2012,

LogEintrag [stationsnummer=0, status=Update, uhrzeit=Fri Jul 27 02:16:24 CEST 2012,
[B]
Mein bisheriger Code der Klasse in der das Sortieren stattfinden soll:[/B]
[JAVA=42]
package de.odr.main;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.Vector;
import java.util.Collections;

public class EintraegeSortieren implements Comparator<EintraegeSortieren> {

Map<String, Vector<LogEintrag>> eintraegeSortieren = new TreeMap<String, Vector<LogEintrag>>();

public EintraegeSortieren(Vector<LogEintrag>logEintraege){
for(LogEintrag le : logEintraege){
if(le.serienNr!=null){
//System.out.println(le.toString());
if(eintraegeSortieren.containsKey(le.serienNr)==false){
Vector <LogEintrag> v = new Vector <LogEintrag>();
v.add(le);
eintraegeSortieren.put(le.serienNr, v);
}
else{
Vector<LogEintrag>vle = eintraegeSortieren.get(le.serienNr);
vle.add(le);
}
}

}
this.print();
}
public void print(){
Iterator<String> itr = eintraegeSortieren.keySet().iterator();
while (itr.hasNext()) {
//System.out.println("str = " + itr.next());
Vector <LogEintrag> logEintraege = eintraegeSortieren.get(itr.next());
System.out.println("\n");
for(LogEintrag le : logEintraege){
System.out.println(le.toString());
}
}
}
@Override
public int compare(EintraegeSortieren o0, EintraegeSortieren o1) {

return 0;
}
}
[/code]
 
Zuletzt bearbeitet:
Ist der Vector selbst ein Logeintrag oder sind darin die (in sich) zu sortierenden Logeinträge?

Sollen die Logeinträge über alle Einträge der Map hinweg sortiert werden?

Und sollten Logeinträge überhaupt sortiert werden?

bye
TT
 
Wie du einen Vector mit gegebenem Comparator sortiert bekommst? Vector implementiert List und ist darum ein geeigneter Parameter für die Methode Collections#sort(java.util.List, java.util.Comparator)

[EDIT]Habe mir grad Deinen Code angeschaut. Ich glaube, es ist noch nicht klar, was ein Comparator macht, warum er generisch ist und welcher Typparameter sinnvoll ist.

Wenn du also Logeinträge miteinander vergleichen willst (um sie entspr. des Vergleichsergebnisses zu sortieren), brauchst Du einen Vergleicher für Logeinträge. Englisch heißt das Comparator for LogEintrag und auf Java heißt das so:
Java:
Comparator<LogEintrag>
Implementiere den, hole Dir in der compare-Methode die Dates und vergleiche diese (Hinweis: Date implementiert Comparable<Date>) ist also direkt mit anderen Dates vergleichbar.
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
Ist der Vector selbst ein Logeintrag oder sind darin die (in sich) zu sortierenden Logeinträge?
LogEintrag ist eine Zeile aus meinem CLS File.

Sollen die Logeinträge über alle Einträge der Map hinweg sortiert werden?

Und sollten Logeinträge überhaupt sortiert werden?

Zu jedem Schlüssel gehören ja sogesehen mehrere Zeilen des CLS Files.
Die Zeilen bilden den Vector.
Die Zeilen die im Vector enthalten sind sollen nach der Uhrzeit sortiert werden.
Sprich jedes Key Value paar muss sortiert werden.

mfg
 
LogEintrag ist eine Zeile aus meinem CLS File.
Zu jedem Schlüssel gehören ja sogesehen mehrere Zeilen des CLS Files.
Die Zeilen bilden den Vector.
Klar soweit.

Die Zeilen die im Vector enthalten sind sollen nach der Uhrzeit sortiert werden.
Sprich jedes Key Value paar muss sortiert werden.
d.h.: Du willst gar nicht die Vectoren sortieren, sondern die Keys der Map aber entsprechend der in den Vectoren gespeicherten Zeitangaben?

Da würde ich pauschal sagen dass eine Map die falsche Datenstruktur für Dein Problem ist.

Du solltest eine Klasse schreiben, die ein Feld für Deine ID und den Vector auf nimmt. Die könnte man in einer [JAPI]List[/JAPI] sammeln und relativ einfach mittels dem Comparator sortieren (oder die Klasse gleich [JAPI]Sortable[/JAPI] implementieren lassen...).

bye
TT
 
Aber wie bekomme ich die Dates in die compare-Methode?
mfg

Das Problem hab ich nun doch hinbekommen. Allerdings funktioniert das sortieren noch nicht richtig.
Soweit mal mein geänderter Code:
[JAVA=42]
@Override
public int compare(LogEintrag o0, LogEintrag o1) {
if(o0.uhrzeit.after(o1.uhrzeit))
return 1;
else if (o0.uhrzeit.before(o1.uhrzeit))
return -1;
else
return 0;
}[/code]

mfg
 
So ich habs nun gelöst. Hab mein Value von Vector in Set geändert und den Comparator dort aufgerufen.
[JAVA=42]
public static void logEintragEinfuegen(Map<String, Set<LogEintrag>> logEintraege, LogEintrag le) {
if (le.serienNr != null) {
if (logEintraege.containsKey(le.serienNr) == false) {
Set<LogEintrag> s = new TreeSet<LogEintrag>(new LogEintragComparator());
s.add(le);
logEintraege.put(le.serienNr, s);
}
else {
Set<LogEintrag> s = logEintraege.get(le.serienNr);
s.add(le);
}
}
}
[/code]

und

[JAVA=42]

import java.util.Comparator;

public class LogEintragComparator implements Comparator<LogEintrag> {
@Override
public int compare(LogEintrag o0, LogEintrag o1) {
if(o0.uhrzeit.after(o1.uhrzeit))
return 1;
else if (o0.uhrzeit.before(o1.uhrzeit))
return -1;
else
return 0;
}
}
[/code]

Vielen Dank für eure Hilfe! =)

mfg
 
Du weist aber schon, dass das
[JAVA=44]if (logEintraege.containsKey(le.serienNr) == false) {[/code]
das selbe ist wie dass:[JAVA=44]if ( ! logEintraege.containsKey(le.serienNr)) {[/code]?
[EDIT]Und wenn wir schon dabei sind:[TIPP]Ausdrücke im If sollten möglichste positiv formuliert werden. Und damit man da nicht selbst umherkopieren muss geht in Eclipse dies: den Cursor auf das
Code:
if
stllen und <ctrl><1> drücken: der erste Vorschlag ist "invert 'if' statement"...[/TIPP][/EDIT]

bye
TT
 
Zuletzt bearbeitet:
Java:
Set<LogEintrag> s = new TreeSet<LogEintrag>(new LogEintragComparator());
Zur Verwendung des Set-Interfaces eine Anmerkung:
Set heißt, es kommen keine Duplikate vor. Durch den Einsatz der Implementierung TreeSet und des Datums-Comparators heißt das bei Dir, dass keine zwei Logdatensätze mit dem selben Datum gespeichert werden können. Wenn Du damit leben kannst, gut. Ansonsten nimm eine Liste und sorge mittels Collections.sort für die Sortierreihenfolge.

Zum Comparator eine Anmerkung:
So wie Du es gemacht hast, ist es etwas umständich. Da Date selbst Comparable ist, kann man das ganze verkürzen:
Java:
public class LogEintragComparator implements Comparator<LogEintrag> {
    @Override
    public int compare(LogEintrag o0, LogEintrag o1) {
       return o0.uhrzeit.compareTo(o1.uhrzeit);
      }
}
 
Zuletzt bearbeitet von einem Moderator:
Zum Comparator eine Anmerkung:
So wie Du es gemacht hast, ist es etwas umständich. Da Date selbst Comparable ist, kann man das ganze verkürzen:
Java:
public class LogEintragComparator implements Comparator<LogEintrag> {
    @Override
    public int compare(LogEintrag o0, LogEintrag o1) {
       return o0.uhrzeit.compareTo(o1.uhrzeit);
      }
}

Danke für den Tipp.
Das mit Set kann ich so lassen, da die Zeitwerte die einem Key zugeordnet sind nicht doppelt vorkommen.

mfg
 
Du weist aber schon, dass das if (logEintraege.containsKey(le.serienNr) == false) {
das selbe ist wie dass:[JAVA=44]if ( ! logEintraege.containsKey(le.serienNr)) {[/code]?
Jetzt weiß ichs =)

[EDIT]Und wenn wir schon dabei sind:[TIPP]Ausdrücke im If sollten möglichste positiv formuliert werden. Und damit man da nicht selbst umherkopieren muss geht in Eclipse dies: den Cursor auf das
Code:
if
stllen und <ctrl><1> drücken: der erste Vorschlag ist "invert 'if' statement"...[/TIPP][/EDIT]

Ok danke =)
 

Zurück
Oben