Comparator

Mariexshhx

Bekanntes Mitglied
Hey ich will einen Comparator schreiben der eine Liste von Zahlen nach geraden Zahlen und nach der Größe ordnet. Wie mache ich das am Besten? erst die größe der Zahlen vergleichen und dann prüfen ob es eine gerade Zahl ist?
 

KonradN

Super-Moderator
Mitarbeiter
Die Frage ist immer: Was zieht am stärksten? Das wird zuerst geprüft.

Wonach soll zuerst sortiert werden? Was kommt erst danach?
 

Mariexshhx

Bekanntes Mitglied
Die Frage ist immer: Was zieht am stärksten? Das wird zuerst geprüft.

Wonach soll zuerst sortiert werden? Was kommt erst danach?
es sollen erst die geraden Zahlen, da aber die kleinste zuerst und dann die ungeraden und da auch die kleinste zuerst

Wenn es nur nach größere wäre, wäre es mir klar wenn eine zahl kleiner ist als die andere dann wird -1 zurückgegeben. Für die gleichen 0 und wenn eine Zahl größer ist 1

Aber ich weiß nicht wie ich es kombinieren soll....
 

KonradN

Super-Moderator
Mitarbeiter
Formuliere es genauer!

Du hast zwei Zahlen: x und y

Diese sollen verglichen werden. Was machst Du? Wann ist x vor y? Wann ist x = y? Wann ist y nach y?
Das wirst Du doch bestimmt hin bekommen. Spiele es mit einigen Zahlenpaaren durch.

Was ist bei 1 und 2? Was ist bei 2 und 3? Was ist bei 4 und 8?

Wirklich jede Prüfung / Gedanken formulieren!
 

Mariexshhx

Bekanntes Mitglied
Formuliere es genauer!

Du hast zwei Zahlen: x und y

Diese sollen verglichen werden. Was machst Du? Wann ist x vor y? Wann ist x = y? Wann ist y nach y?
Das wirst Du doch bestimmt hin bekommen. Spiele es mit einigen Zahlenpaaren durch.

Was ist bei 1 und 2? Was ist bei 2 und 3? Was ist bei 4 und 8?

Wirklich jede Prüfung / Gedanken formulieren!
x ist vor y wenn wenn beides gerade Zahlen sind und x<y. und x ist vor y wenn beides keine gerade Zahlen sind aber x<y. Sie sind gleich wenn die Zahlen gleich sind, würde ich sagen ... Und was meinst du mit y nach y?
 

KonradN

Super-Moderator
Mitarbeiter
Und was meinst du mit y nach y?
Das war nur ein Tippfehler.

Ich wollte keine so große Entscheidungsmatrix - ich wollte Schritte zur Prüfung.

Wobei Du das auch mit so einer Entscheidungsmatrix lösen könntest, aber das ist eher ungewöhnlich.

Daher ist die Frage: Kannst Du es in Schritten beschreiben? In Ansätzen hast Du es ja schon, denn das und gibt ja eine Reihenfolge.

Du prüft also zuerst bezüglich Gerade / Ungerade. Was kann da raus kommen? Wie geht es da jeweils weiter? Wie kannst Du diese Prüfung durchführen?
 

Mariexshhx

Bekanntes Mitglied
Das war nur ein Tippfehler.

Ich wollte keine so große Entscheidungsmatrix - ich wollte Schritte zur Prüfung.

Wobei Du das auch mit so einer Entscheidungsmatrix lösen könntest, aber das ist eher ungewöhnlich.

Daher ist die Frage: Kannst Du es in Schritten beschreiben? In Ansätzen hast Du es ja schon, denn das und gibt ja eine Reihenfolge.

Du prüft also zuerst bezüglich Gerade / Ungerade. Was kann da raus kommen? Wie geht es da jeweils weiter? Wie kannst Du diese Prüfung durchführen?
also ich muss erst prüfen ob gerade oder ungerade für beide Zahlen
mit wenn beide o1%2==0 und o2%2==0 dann muss ja geprüft werden welche von beiden kleiner ist für die wird dann -1 zurückgegegeben
ich bin mir unsicher was ist wenn man eine gerade und eine ungerade Zahl hat muss man dann für die gerade auch -1 und für die ungerade 1 zurückgeben? und wenn beide ungerade sind muss man für die kleinere Zahl auch -1 zurückgeben.
 

KonradN

Super-Moderator
Mitarbeiter
Du hast einen Methodenaufruf mit zwei Parametern und du gibst genau einen Wert zurück.
Also wenn der erste Parameter vor dem Zweiten sein soll, dann gibst Du eine negative Zahl zurück.
Wenn er nach dem zweiten Parameter kommen soll, dann gibst du eine positive Zahl zurück.

Daher könnte man jetzt überlegen, was denn das %2 zurück gibt. Dann kann man ggf. auf eine Rechnung kommen, bei der eine negative Zahl, 0 oder eine positive Zahl heraus kommt.
 

Mariexshhx

Bekanntes Mitglied
Du hast einen Methodenaufruf mit zwei Parametern und du gibst genau einen Wert zurück.
Also wenn der erste Parameter vor dem Zweiten sein soll, dann gibst Du eine negative Zahl zurück.
Wenn er nach dem zweiten Parameter kommen soll, dann gibst du eine positive Zahl zurück.

Daher könnte man jetzt überlegen, was denn das %2 zurück gibt. Dann kann man ggf. auf eine Rechnung kommen, bei der eine negative Zahl, 0 oder eine positive Zahl heraus kommt.
wenn der rest ==0 dann -1 wenn der rest für beide gleich ist 0 und wenn er ungleich 0 ist 1?
 

mihe7

Top Contributor
%2 gibt entweder 0 oder 1 zurück.

Wenn Du also (o1 % 2) - (o2 % 2) rechnest, bekommst Du entweder -1, 0 oder 1 raus. Bei 0 brauchst Du noch den direkten Vergleich.
 

Mariexshhx

Bekanntes Mitglied
%2 gibt entweder 0 oder 1 zurück.

Wenn Du also (o1 % 2) - (o2 % 2) rechnest, bekommst Du entweder -1, 0 oder 1 raus. Bei 0 brauchst Du noch den direkten Vergleich.
und was ist wenn beide keine geraden Zahlen sind braucht man dann nicht auch den direkten Vergleich?
ist es eig bei Comparartoren so das jede Zahl mit jeder Zahl verglichen wird ?
 

KonradN

Super-Moderator
Mitarbeiter
wenn ich z.B. eine liste von Integern habe wird dann jedes Interger objekt mit jedem Integer Objekt verglichen?
Nein, Wenn Du eine Liste von Integern hast, dann hast Du eine Liste von Integern. Warum sollte da irgendwas verglichen werden?

Dazu musst Du erst eine Aktion anstarten. Du könntest die Liste z.B. sortieren. Dann wird irgend ein Sortier-Algorithmus durchgeführt der dann auch irgendwelche Werte vergleichen wird. Welche Werte verglichen werden hängt aber vom Algorithmus ab.
 

Mariexshhx

Bekanntes Mitglied
ich meine sowas wie List<Integer> = Arraylist<>(new geradeZahlenComparator()); geht sowas nicht ?
Nein, Wenn Du eine Liste von Integern hast, dann hast Du eine Liste von Integern. Warum sollte da irgendwas verglichen werden?

Dazu musst Du erst eine Aktion anstarten. Du könntest die Liste z.B. sortieren. Dann wird irgend ein Sortier-Algorithmus durchgeführt der dann auch irgendwelche Werte vergleichen wird. Welche Werte verglichen werden hängt aber vom Algorithmus ab.
 

KonradN

Super-Moderator
Mitarbeiter
ich meine sowas wie List<Integer> = Arraylist<>(new geradeZahlenComparator()); geht sowas nicht ?
a) Hast Du es mal ausprobiert?
b) Hast Du mal in die Dokumentation geschaut?
c) Was wäre da denn Deine Erwartungshaltung. Was sollte da denn dann passieren? Und wie sollte sich die List dann verhalten? In dem Zusammenhang dann ggf. auch die Doku zu List ansehen: Entsprechen Deine Erwartungen denn noch einer Liste?
 

mihe7

Top Contributor
wenn ich z.B. eine liste von Integern habe wird dann jedes Interger objekt mit jedem Integer Objekt verglichen?
Wie @KonradN schon geschrieben hat: eine Liste vergleicht erst mal gar nix und es hängt vom Algorithmus ab, wie oft und mit welchen Elementen ein Vergleich stattfindet.

Verwendest Du einen Comparator z. B. um das Minimum in einer Liste mit n Einträgen zu finden, kann es sein, dass n-1 Einträge mit dem Minimum verglichen werden.
 

Mariexshhx

Bekanntes Mitglied
a) Hast Du es mal ausprobiert?
b) Hast Du mal in die Dokumentation geschaut?
c) Was wäre da denn Deine Erwartungshaltung. Was sollte da denn dann passieren? Und wie sollte sich die List dann verhalten? In dem Zusammenhang dann ggf. auch die Doku zu List ansehen: Entsprechen Deine Erwartungen denn noch einer Liste?
sowas geht tatsächlich nicht aber es geht Collection.sort(liste, new geradeZahlenComparartor())
 

Oneixee5

Top Contributor
Ein Comparator ist nichts weiter als eine Vergleichsfunktion. Übersetzung: to compare - vergleichen
Dafür wird von Java ein Interface bereitgestellt. Wenn man die einzige Methode implementiert wird erwartet, dass -1 als KLEINER, 0 als GLEICH und 1 als GRÖßER zurückgegeben wird.
Denkt man darüber nach stellt man fest, dass es völlig gleichgültig ist, ab man gerade Zahlen oder ungerade Zahlen vergleicht.
Eine naive Umsetzung würde etwa so aussehen:
Java:
        final List<Integer> list = List.of(3, 2, 1);
        
        final Comparator<Integer> comparator = new Comparator<>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 < o2)
                    return -1;
                if(o1 == o2)
                    return 0;
                
                return 1;
            }
        };
        
        Collections.sort(list, comparator);
        
        System.out.println(list);
~ unabhängig davon, ob man das in einer aktuellen Java-Version so machen würde oder nicht!
Will man also zuerst nach geraden und ungeraden Werten sortieren - und die geraden Zahlen in der Liste nach vorn sortieren, dann muss für o1 == gerade und o2 == ungerade -> -1 zurückgeben werden, usw.

Sind aber o1 und o2 gerade kann man statt 0 zurückzugeben, diese zusätzlich entsprechend ihrer Werte gewichten - also o1 < o2 -> -1.
 

mihe7

Top Contributor
Java:
Comparator<Integer> comp = Comparator
        .comparingInt((Integer value) -> Integer.remainderUnsigned(value, 2))
        .thenComparing(Comparator.naturalOrder());
 

Mariexshhx

Bekanntes Mitglied
Ein Comparator ist nichts weiter als eine Vergleichsfunktion. Übersetzung: to compare - vergleichen
Dafür wird von Java ein Interface bereitgestellt. Wenn man die einzige Methode implementiert wird erwartet, dass -1 als KLEINER, 0 als GLEICH und 1 als GRÖßER zurückgegeben wird.
Denkt man darüber nach stellt man fest, dass es völlig gleichgültig ist, ab man gerade Zahlen oder ungerade Zahlen vergleicht.
Eine naive Umsetzung würde etwa so aussehen:
Java:
        final List<Integer> list = List.of(3, 2, 1);
       
        final Comparator<Integer> comparator = new Comparator<>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 < o2)
                    return -1;
                if(o1 == o2)
                    return 0;
               
                return 1;
            }
        };
       
        Collections.sort(list, comparator);
       
        System.out.println(list);
~ unabhängig davon, ob man das in einer aktuellen Java-Version so machen würde oder nicht!
Will man also zuerst nach geraden und ungeraden Werten sortieren - und die geraden Zahlen in der Liste nach vorn sortieren, dann muss für o1 == gerade und o2 == ungerade -> -1 zurückgeben werden, usw.

Sind aber o1 und o2 gerade kann man statt 0 zurückzugeben, diese zusätzlich entsprechend ihrer Werte gewichten - also o1 < o2 -> -1.
also wäre es
INI:
if(o1 %2==0 && o2%2!=0){
return -1;
}

if(o1%2==0 && o2%2==0){
return o1.compareTo(o2)
//gibt doch dann -1 zurück wenn o1 kleiner ist
}else{
return 1;
// wenn beide ungerade sind ?
}

so in etwa
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du Probleme hast, einen komplexen Algorithmus zu implementieren, dann unterteile ihn in Teile.

Dazu musst Du nur sauber formulieren, was Du überhaupt machst:
1. Du prüfst gerade / ungerade der Zahlen.
2. Wenn Du damit noch kein Resultat erreicht hast, dann vergleichst Du die Zahlen selbst.

Also im Code kann das dann etwas sein wie:
Java:
int result = (o1 % 2) - (o2 % 2);
if (result == 0) result = Integer.compare(o1,o2);
return result;
 

Mariexshhx

Bekanntes Mitglied
Wenn Du Probleme hast, einen komplexen Algorithmus zu implementieren, dann unterteile ihn in Teile.

Dazu musst Du nur sauber formulieren, was Du überhaupt machst:
1. Du prüfst gerade / ungerade der Zahlen.
2. Wenn Du damit noch kein Resultat erreicht hast, dann vergleichst Du die Zahlen selbst.

Also im Code kann das dann etwas sein wie:
Java:
int result = (o1 % 2) - (o2 % 2);
if (result == 0) result = Integer.compare(o1,o2);
return result;
Result musst doch aber nicht immer -1 0 oder 1 sein. Das kann doch auch größer sein
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
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
S Comparator für Generiks Java Basics - Anfänger-Themen 6
Helgon Interface Comparator wird nicht instanziert Java Basics - Anfänger-Themen 3
C Comparator mit Double Werten? Java Basics - Anfänger-Themen 12
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
E Comparator sortiert falsch... Java Basics - Anfänger-Themen 2
M Comparator Java Basics - Anfänger-Themen 7
B OOP Logikhilfe zum Comparator 2 Java Basics - Anfänger-Themen 12
B OOP Logikhilfe zum Comparator Java Basics - Anfänger-Themen 11
G Comparator Problem Java Basics - Anfänger-Themen 5
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
H Comparable und Comparator Java Basics - Anfänger-Themen 22
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
B OOP Comparator - Sortierung "optisch" Darstellen Java Basics - Anfänger-Themen 17
A JTable sortieren mit einem Comparator Java Basics - Anfänger-Themen 2
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
G Objekte mit dem Attribut title mit Comparator sortieren Java Basics - Anfänger-Themen 5
P unchecked conversion to conform to Comparator Java Basics - Anfänger-Themen 3
G Comparator- methode compare exception werfen Java Basics - Anfänger-Themen 4
B interface Comparator Java Basics - Anfänger-Themen 4
M Hilfe bei der Erstellung der Comparator Klasse Java Basics - Anfänger-Themen 10
M ArrayList sortieren mittels Comparator Java Basics - Anfänger-Themen 10
G Sortieren ohne Comparator? Java Basics - Anfänger-Themen 4
G Comparator Java Basics - Anfänger-Themen 10
S Frage zu Comparator Java Basics - Anfänger-Themen 3
G ArrayList und Comparator Java Basics - Anfänger-Themen 6
M Comparator - Sortierkriterium Java Basics - Anfänger-Themen 11
L Comparator Java Basics - Anfänger-Themen 5
T Problem mit Comparator! Java Basics - Anfänger-Themen 7
C Anstatt Spalte, Zeile mit Comparator sortieren . Java Basics - Anfänger-Themen 5
B Liste sortieren mit Comparator Java Basics - Anfänger-Themen 2
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
S JTable mit Comparator sortieren, die Frage ist wo? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
W Comparator Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben