Vergleich von Objekten anhand variierender Kriterien

Raphalon

Aktives Mitglied
Hallo,

in einem Programm möchte ich File-Objekte miteinander vergleichen, die sich in einer Collection, z.B. HashSet<File> befinden. Der Anwender kann zuvor auswählen, nach welchen Kriterien verglichen werden soll, also etwa
- lastModified und size oder
- nur size oder
- lastModified, size und canRead
- usw.

Um die File-Objekte miteinander vergleichen zu können, überschreibe ich equals(). Dabei möchte ich dann nur diejenigen Kriterien für den Vergleich verwenden, die der User zuvor selektiert hat. Wie aber kann ich alle möglichen Kombinationen von Vergleichskriterien berücksichtigen? Bei nur zwei Kriterien könnte man vielleicht noch mit if-else-Blöcken die Variationen berücksichtigen. Doch wie geht das bei z.B. 8-10 möglichen Kriterien? Wie kann ich das umsetzen? Gibt es da irgendein Design-Pattern?

Viele Grüße,

Raphalon
 

Marco13

Top Contributor
equals zu überschreiben macht da nicht viel Sinn, und kann übel nach hinten losgehen wenn man's falsch macht (equals muss bestimmte Bedingungen erfüllen).

Kannst mal schauen, was bei http://www.java-forum.org/allgemeines/39510-arrays-listen-sortieren.html zu "Comparatoren" steht. Im speziellen würde man für Files dann einen Comparator erstellen, der nach Datum sortiert, und einen, der nach Größe sortiert, und die dann entsprechend verwenden. Praktischerweise könnte man auch einen "CompoundComparator" erstellen, der intern eine Liste von Comparatoren (also Sortierkriterien) hat und die beim Vergleich der Reihe nach abklappert.
 

Raphalon

Aktives Mitglied
Danke für den Tip. Die Verwendung eines Comparator wäre eine Idee. Mir ist aber nicht klar, wie genau das ingesamt geht. Ich hätte z.B. eine Klasse, die von File abgeleitet ist und die das Interface (Comparable oder Comparator) implementiert. Dabei würde ich dann z.B. das Kriterium size verwenden. Sollte ich jetzt das Interface mehrfach implementieren, um auch Comparators für die anderen Kriterien zu haben? Wie geht das? Und wie würde ich diese dann kombinieren? Wenn man wiederum nur eine Implementierung verwendet, dann stellt sich wieder die Frage, wie man den unterschiedlichen Kombinationen der Kriterien Rechnung trägt, also alle Variationen erlaubt.

Ich kann mir also unter "die dann entsprechend verwenden" und "der Reihe nach abklappert" noch nichts konkretes vorstellen. Könntest Du da noch Hinweise geben?
 

Marco13

Top Contributor
Nein, der wichtigste Vorteil beim Comparator ist eben, dass man NICHT von der Klasse erben muss. (Von File zu erben ist sehr heikel - das ist eine vergleichsweise "Betriebssystemnahe" Klasse, der sollte man nicht ins Handwerk pfuschen...)

Comparator ist ein Interface, das man NUR implementiert, um eben eine Klasse zu haben, die Vergleiche durchführen kann. Ein Beispiel könnte sein
Java:
class FileBySizeComparator implements Comparator<File>
{
    public int compare(File f0, File f1)
    {
        if (f0 ist größer als f1) return -1;
        if (f1 ist größer als f0) return  1;
        return 0;
    }
}
Und ähnlich eben einen "FileByDateComparator" oder so..


Dann kann man z.B. eine Liste von File-Objekten so sortieren:
Code:
List<File> files = ...
Collections.sort(files, new FileBySizeComparator());

Um zwei Comparatoren zu kombinieren kann man dann sowas machen wie
Java:
class CompoundComparator implements Comparator<File>
{
    private Comparator<File> c0;
    private Comparator<File> c1;

    public CompoundComparator(Comparator<File> c0, Comparator<File> c1)
    {
        this.c0 = c0;
        this.c1 = c1;
    }

    public int compare(File f0, File f1)
    {
        int result = c0.compare(f0, f1;
        if (result != 0) return result;
        result = c1.compare(f0, f1);
        return result;
    }
}
(Könnte man mit einer Liste und Generics noch allgemeiner machen)


Wenn man dann sowas macht wie
Code:
List<File> files = ...
Comparator<File> c0 = new FileBySizeComparator();
Comparator<File> c1 = new FileByDateComparator();
Comparator<File> c = new CompoundComparator(c0, c1);
Collections.sort(files, c);

Dann werden die Dateien nach der Größe sortiert, und wenn die Größe gleich ist, wird nach dem Datum sortiert (Stichwort "Lexikographische Sortierung")
 

Raphalon

Aktives Mitglied
Mit dem Comparator kann man eine Collection sortieren (und _innerhalb_ dieser Collection vergleichen). Kann ich das aber auch verwenden, wenn ich zwei Collections habe? In beiden Collections sind File-Objekte. Und nun soll für jedes File-Objekt der einen Collection herausgefunden werden, ob es sie auch in der anderen Collection gibt. Das wäre sozusagen das Delta. Vermutlich habe ich meine ursprüngliche Frage nicht klar genug formuliert, doch darum geht es mir.
 

Marco13

Top Contributor
Vermutlich habe ich meine ursprüngliche Frage nicht klar genug formuliert, doch darum geht es mir.

Richtig. Davon stand in der ursprünglichen Frage kein Wort :noe:

Code:
Collection<File> c0 = ...
Collection<File> c1 = ...
Comparator<File> comparator = ...
for (File f0 : c0)
{
    for (File f1 : c1)
    {
        int value = comparator.compare(c0, c1);
        if (value == 0)
        {
            System.out.println("Sowas wie "+f0+" gibts auch in "+c1);
        }
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Vergleich von Objekten Java Basics - Anfänger-Themen 2
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
Zeppi Vergleich von Array-Inhalten Java Basics - Anfänger-Themen 14
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
W Vergleich von DatenPaketen Java Basics - Anfänger-Themen 6
B String vergleich Java Basics - Anfänger-Themen 3
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
V Fließkommazahlen Vergleich Java Basics - Anfänger-Themen 7
J Vergleich Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
T Vergleich und Ausgabe von Zahlen Java Basics - Anfänger-Themen 1
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
J Fehler bei Vergleich auf den grössten Wert Java Basics - Anfänger-Themen 2
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
T Input/Output String-Vergleich schlägt fehl Java Basics - Anfänger-Themen 7
W Konvertierung und Vergleich unterschiedlicher Zeitformate Java Basics - Anfänger-Themen 11
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
M String-Vergleich und NullPointerException Java Basics - Anfänger-Themen 4
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L PW-Vergleich Java Basics - Anfänger-Themen 5
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
S Vergleich von Listen Java Basics - Anfänger-Themen 6
J vergleich von arrays (benötige Hilfe/Denkanstoß) Java Basics - Anfänger-Themen 16
V Einfacher vergleich von Arrays geht schief Java Basics - Anfänger-Themen 2
T Operatoren Multiplikation nur mit Addition, Subtraktion und Vergleich Java Basics - Anfänger-Themen 29
N Methoden Array vergleich funzt nicht Java Basics - Anfänger-Themen 8
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
S Vergleichsmethode zum Objekt-Vergleich mit < und > Java Basics - Anfänger-Themen 4
F Problem bei Vergleich Java Basics - Anfänger-Themen 3
S File vergleich - Junit Java Basics - Anfänger-Themen 6
P String-Vergleich Java Basics - Anfänger-Themen 3
S Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen Java Basics - Anfänger-Themen 14
W Vergleich ob Buchstabe in einem Wort enthalten ist Java Basics - Anfänger-Themen 3
C String Objekte Vergleich je nach Instanzierung unterschiedlich!!?!! Java Basics - Anfänger-Themen 4
R String-Vergleich Java Basics - Anfänger-Themen 15
C Variablen Vergleich funktioniert nicht Java Basics - Anfänger-Themen 11
J Erste Schritte Vergleich der String-Objekte Java Basics - Anfänger-Themen 17
B Zwei verschiedene Daten vergleich Java Basics - Anfänger-Themen 2
A Variablen Vergleich Java Basics - Anfänger-Themen 5
P Erste Schritte vergleich substring und string Java Basics - Anfänger-Themen 4
G Date - Calender | "Vergleich" Java Basics - Anfänger-Themen 3
M Vergleich mit Toleranz Java Basics - Anfänger-Themen 7
B Objekt Vergleich - Unterschiede ausgeben Java Basics - Anfänger-Themen 4
P Vergleich mit Variablen Java Basics - Anfänger-Themen 6
Y Java Programm URL und String Vergleich! Java Basics - Anfänger-Themen 4
K Vergleich von variable und array Java Basics - Anfänger-Themen 9
L vergleich zweier texte Java Basics - Anfänger-Themen 18
H Beim Vergleich/Sortieren mehr als zwei Objekte berücksichtigen Java Basics - Anfänger-Themen 14
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
P Vergleich von Enums Java Basics - Anfänger-Themen 4
S String Vergleich funktioniert nicht Java Basics - Anfänger-Themen 3
A String-Vergleich geht nicht Java Basics - Anfänger-Themen 2
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
F Methoden Vergleich von int Zahlen Java Basics - Anfänger-Themen 16
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
N Vergleich per equals Java Basics - Anfänger-Themen 5
Z XML Vergleich Java Basics - Anfänger-Themen 20
S Herunterladen von Dateien mit Vergleich Java Basics - Anfänger-Themen 6
L Problem String-Vergleich Java Basics - Anfänger-Themen 2
E Objekte-Vergleich Java Basics - Anfänger-Themen 6
Y Datentypen String vergleich Java Basics - Anfänger-Themen 3
K Datentypen Arrays in Java - Adress-Arithmetik im Vergleich zu Listen Java Basics - Anfänger-Themen 4
S equals vergleich Java Basics - Anfänger-Themen 10
A Datentypen instanceof VS Class - Vergleich Java Basics - Anfänger-Themen 4
M Char vergleich zu Int Java Basics - Anfänger-Themen 10
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
algorismi Ausführungszeit Vergleich == true Java Basics - Anfänger-Themen 8
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
T Zwei listen vergleich und selbige löschen Java Basics - Anfänger-Themen 4
T Vergleich mit Typecasts Java Basics - Anfänger-Themen 3
Screen Eine Frage zu moueMove in applets und deren Vergleich Java Basics - Anfänger-Themen 11
M Vergleich Float-, Doublewert Java Basics - Anfänger-Themen 10
G Vergleich zweier Arrays Java Basics - Anfänger-Themen 8
U Methode Vergleich von 2 Arrays Java Basics - Anfänger-Themen 5
S String Vergleich mit Passwort geht nur bei Zahlen ? Java Basics - Anfänger-Themen 7
G Vergleich klappt nicht Java Basics - Anfänger-Themen 3
T Vergleich von generischen Typen Java Basics - Anfänger-Themen 2
C DB Vergleich mit Eingabe Java Basics - Anfänger-Themen 5
G Vergleich großer Basen/Exponenten? Java Basics - Anfänger-Themen 3
N Vergleich findet nicht statt. Java Basics - Anfänger-Themen 13
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
A Vergleich schlägt fehl Java Basics - Anfänger-Themen 15
G Vergleich bei MD5-Verschlüsselung Java Basics - Anfänger-Themen 3
R +1 Vergleich Java Basics - Anfänger-Themen 3
E Char vergleich Java Basics - Anfänger-Themen 7
loadbrain Array vergleich mit 2 for schleifen Java Basics - Anfänger-Themen 6
D Vergleich von ListenElementen Java Basics - Anfänger-Themen 2
M Problem bei einem Vergleich Java Basics - Anfänger-Themen 6
G Vergleich Eingabe mit Wert in vorhandenem Array Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben