Wann Comparator und wann Comparable

Status
Nicht offen für weitere Antworten.

Biesterfeld

Aktives Mitglied
Hej Board,

folgender Fall: Ich sammel eine große Menge Objekte in einem HashSet ein, die ich im weiteren Programmverlauf immerwieder nach verschiedenen Kriterien in einen TreeSet sortieren möchte.

Was ist einem solchen Fall sinnvoll, sie zusammen mit einem Comparator dem TreeSet zu übergeben, oder Comparable in der Klasse zu implementieren und ... ja und weiß gar nicht, kann ich überhaupt dann noch nach je nach Anfrage nach verschiedenen Kriterien sortieren? Also eigentlich dachte ich mir, dass Comparable da eher geschickt ist, oder überseh ich da ein feature?

Und dann noch ne Frage: Was ist eleganter? Für jedes Kriterium einen eigenen Comparator schreiben, oder die unterschiedlichen Sortierkriterien in einem Comparator implementieren und diesen entsprechend Aufrufen, also

Code:
new TreeSet(collection, new CompareObject("CRITERION_1"));

public class CompareObject implements Comparator{
  
  private final String criterion;
  
  CompareObject(String criterion){
    this.criterion = criterion;
  }
  
  public int compare(Object arg0, Object arg1){
     if(criterion.equals("CRITERION_1"))
       return compareByC1(Object arg0, Object arg1);
     else
        return compareByC2(Object arg0, Object arg1);
  }

  private int compareByC1(Object arg0, Object arg1){
     ...
  }

  private int compareByC2(Object arg0, Object arg1){
     ...
  }
  
}

Danke schonmal für eure Hilfe.
Beste Grüße
Biesterfeld
 

Bert Brenner

Bekanntes Mitglied
Einen Comparator verwende ich auf Klassen die Comparable nicht implementieren oder deren Comparable implementation für meine Zwecke nicht geeignet sind.

Ich glaub (als Java halbkönner ;) ) genau dafür ist der Comparator auch vorgesehen, werde aber auch mal schaun was die Gurus dazu sagen.
 
G

Guest

Gast
Am besten eine Kombination aus beiden.
Ich mache es oft wie folgt:
Code:
class Person implements Comparable {
  private Integer id;
  private String firstname; 
  private Sring lastname;

  ...

  public int compareTo(Object o) {
    return PersonComparator.ASC_BY_ID.compare(this, (Person)o);
  }
}

final class PersonComparator implements Comparator {
  public static final PersonComparator ASC_BY_ID = new PersonComparator(0, true);
  public static final PersonComparator ASC_BY_FIRSTNAME = new PersonComparator(1, true);
  public static final PersonComparator ASC_BY_LASTNAME = new PersonComparator(2, true);
  public static final PersonComparator DESC_BY_ID = new PersonComparator(0, false);
  public static final PersonComparator DESC_BY_FIRSTNAME = new PersonComparator(1, false);
  public static final PersonComparator DESC_BY_LASTNAME = new PersonComparator(2, false);

  private int sortorder;
  private boolean ascending;

  private PersonComparator(int sortorder, boolean ascending) {
    this.sortorder = sortorder;
    this.ascending = ascending;
  }

  public int compare(Object o1, Object o2) {
    Person p1 = (Person)(ascending?o1:o2);
    Person p2 = (Person)(ascending?o2:o1);
    switch(sortorder) {
      case 0: return p1.id.compareTo(p2.id);
      case 1: return p1.firstname.compareTo(p2.firstname);
      case 2: return p1.lastname.compareTo(p2.lastname);
    }
    return 0; // to make the compiler happy
  }
}
Die Haupteigenschaft bzw. das häufigste Attribut der Klasse wird als Defaul bei Comparable verwendet,
alles andere optional, um mal eine Collection solcher Objekte nach anderen Kriterien zu sortieren.
z.B.
Code:
Collection personen = connector.getPersonenByWhatever(...);
Collections.sort(personen, PersonComparator.DESC_BY_LASTNAME);
 
G

Guest

Gast
Korrektur (unnötiger cast)
Code:
class Person implements Comparable { 
  private Integer id; 
  private String firstname; 
  private Sring lastname; 

  ... 

  public int compareTo(Object o) { 
    return PersonComparator.ASC_BY_ID.compare(this, o); 
  } 
}
 
G

Guest

Gast
Ehmm, und wo wir schon bei Fehlern sind :roll:
Code:
public int compare(Object o1, Object o2) { 
  Person p1 = (Person)(ascending?o1:o2); 
  Person p2 = (Person)(ascending?o2:o1); 
  switch(sortorder) { 
    case 0: return p1.getId().compareTo(p2.getId()); 
    case 1: return p1.getFirstname().compareTo(p2.getFirstname()); 
    case 2: return p1.getLastname().compareTo(p2.getLastname()); 
  } 
  return 0; // to make the compiler happy 
}
OK, jetzt aber. :wink:
 

Biesterfeld

Aktives Mitglied
Hej,

dank euch für die Antworten. Ich hatte natürlich nach "Comparator Comparable" (is ja doof dass sich Suchergebnisse nicht verlinken lassen) gesucht gehabt aber nicht wirklich viel dazu gefunden. ???:L

Aber das war schon sehr hilfreich, insbesondere die Anwtort von dem Gast war sehr, sehr geil. Werds wohl so machen, nur dass ich mir die Implementierung von Comparable sparen werde.

Dank euch ganz herzlich und wünsche ein frohes Osterfest.
Beste Grüße
Biesterfeld
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I Logik Zahlungsprozess - Wann Bestellobjekt anlegen? Java Basics - Anfänger-Themen 2
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
W Wann Rückgabewerte 0, 1, -1? Java Basics - Anfänger-Themen 27
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Wann Methode abstract? Java Basics - Anfänger-Themen 10
S Wann buffer löschen? Java Basics - Anfänger-Themen 5
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
K Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt? Java Basics - Anfänger-Themen 7
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
O Wann nutzt man static? Java Basics - Anfänger-Themen 19
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
D Wann genau nutze ich ein solches Interface? Java Basics - Anfänger-Themen 3
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
C Variablen Wann werden Instanzvariablen initalisiert? Java Basics - Anfänger-Themen 10
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
T Ab wann ist es ein großes Projekt? Java Basics - Anfänger-Themen 35
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
W Wann nutze ich "import"? Java Basics - Anfänger-Themen 12
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
H Wann ein Objekt der Programmklasse in main anlegen Java Basics - Anfänger-Themen 2
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
T Wann for und wann while?? Java Basics - Anfänger-Themen 35
-horn- Wann wird alles NaN erzeugt? Java Basics - Anfänger-Themen 22
S Wann wird eine Klasse geladen? Java Basics - Anfänger-Themen 17
C this - wann verwende ich das? Java Basics - Anfänger-Themen 10
T Threads - Ab wann wirds Kritisch?! Java Basics - Anfänger-Themen 7
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
G field public/private wann Java Basics - Anfänger-Themen 11
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
GambaJo Wann try.catch nutzen? Java Basics - Anfänger-Themen 11
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
S wann static Funktionen wann nicht Java Basics - Anfänger-Themen 6
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
Bernasconi Programmierstil / Wann eine neue Datei? Java Basics - Anfänger-Themen 5
M wann, welche schleife Java Basics - Anfänger-Themen 3
M Ab wann ist die Datei sichtbar? Java Basics - Anfänger-Themen 3
G Herausfinden, wann mehrere Threads abgeschlossen sind Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
N SAX, StAX, JDOM oder DOM , ab wann welches für XML Java Basics - Anfänger-Themen 14
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
I Festellen wann Methode in anderer Klasse fertig ist Java Basics - Anfänger-Themen 5
M wann statische klassen? Java Basics - Anfänger-Themen 14
M Wann ist initialisieren sinnvoll? Java Basics - Anfänger-Themen 4
R Wann benutzt man << oder >> ? Java Basics - Anfänger-Themen 2
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
M Comparator Java Basics - Anfänger-Themen 25
M Comparator Java Basics - Anfänger-Themen 4
berserkerdq2 Wie lege ich ein Attribut comparator an? Java Basics - Anfänger-Themen 13
W Personen sortieren mit Comparator Java Basics - Anfänger-Themen 9
H Comparator Fehlermeldung Java Basics - Anfänger-Themen 5
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
R Methode zwei Sortierkriterien der Klasse Comparator übergeben Java Basics - Anfänger-Themen 4
O Lambda Ausdrücke in einem Comparator Java Basics - Anfänger-Themen 4
A Priority Queue / Comparator Java Basics - Anfänger-Themen 6
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
J Comparator Java Basics - Anfänger-Themen 21
A Comparator Java Basics - Anfänger-Themen 4
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
V Comparator Java Basics - Anfänger-Themen 16
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
B Comparable & Comparator Java Basics - Anfänger-Themen 9
C Comparator und private Variablen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben