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?
es sollen erst die geraden Zahlen, da aber die kleinste zuerst und dann die ungeraden und da auch die kleinste zuerstDie Frage ist immer: Was zieht am stärksten? Das wird zuerst geprüft.
Wonach soll zuerst sortiert werden? Was kommt erst danach?
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?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!
Das war nur ein Tippfehler.Und was meinst du mit y nach y?
also ich muss erst prüfen ob gerade oder ungerade für beide ZahlenDas 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?
wenn der rest ==0 dann -1 wenn der rest für beide gleich ist 0 und wenn er ungleich 0 ist 1?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.
und was ist wenn beide keine geraden Zahlen sind braucht man dann nicht auch den direkten Vergleich?%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.
Wenn beide Zahlen ungerade sind, ist o1 % 2 == 1 und o2 % 2 == 1, die Differenz also 0...und was ist wenn beide keine geraden Zahlen sind braucht man dann nicht auch den direkten Vergleich?
Der Comparator vergleicht zwei Objekte miteinander.ist es eig bei Comparartoren so das jede Zahl mit jeder Zahl verglichen wird ?
wenn ich z.B. eine liste von Integern habe wird dann jedes Interger objekt mit jedem Integer Objekt verglichen?Der Comparator vergleicht zwei Objekte miteinander.
Nein, Wenn Du eine Liste von Integern hast, dann hast Du eine Liste von Integern. Warum sollte da irgendwas verglichen werden?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.
a) Hast Du es mal ausprobiert?ich meine sowas wie List<Integer> = Arraylist<>(new geradeZahlenComparator()); geht sowas nicht ?
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.wenn ich z.B. eine liste von Integern habe wird dann jedes Interger objekt mit jedem Integer Objekt verglichen?
sowas geht tatsächlich nicht aber es geht Collection.sort(liste, new geradeZahlenComparartor())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?
Eben, hier wird der Implementierung eins Sortieralgorithmus ein Comparator übergeben, der dazu dient, zwei Elemente miteinander zu vergleichen. Wie viele und welche Elemente miteinander verglichen werden, hängt vom Algorithmus ab.Collection.sort(liste, new geradeZahlenComparartor())
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);
also wäre esEin 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:
~ unabhängig davon, ob man das in einer aktuellen Java-Version so machen würde oder nicht!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);
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.
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 ?
}
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 seinWenn 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;
Ja, das Ergebnis muss nur negativ, positiv oder 0 sein: "a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second."Result musst doch aber nicht immer -1 0 oder 1 sein. Das kann doch auch größer sein