Collections.sort als Lambda

Xalo

Mitglied
Hey ich bin gerade am lernen für meine Klausur am Dienstag und gehen ein paar altklausuren durch. Eine aufgabe ist :
Schreiben Sie einen Comparator<City> byCityDesc als Lambda-Ausdruck, so dass für eine
List<City> cities der Aufruf von Collections.sort(cities, byNameDesc) die Liste
nach Namen der Stadt absteigend sortiert (also zuerst die im Alphabet am weitesten hinten
stehende Stadt).

Das ist meine Klasse City:

Java:
public class City {
public String name;
public int postCode;
}
Hier hab ich Elemente erstellt und eingefügt:

Code:
 List<City> cities = new ArrayList<>();
        City stg = new City("stg",123456);
        City ham = new City("ham",541231);
        City fra = new City("fra",819237);
        City mun = new City("mun",192309);

        cities.add(stg);
        cities.add(ham);
        cities.add(fra);
        cities.add(mun);

Ich hab das mal für die Postcode Parameter gemacht
Code:
 Comparator<City> compare = (a,b) -> a.getPostCode() - b.getPostCode();
        cities.sort(compare);
       
cities.forEach(city -> System.out.println(city.getPostCode()));

Aber wie kriege ich das jetzt für die Name der Städte(also Strings) hin und ist das für PostCode soweit richtig?
 
Also für PostCode mag es so korrekt sein. Aber das liegt an einem vermutlich reduzierten Wertebereich. Für int Werte ist dies so nicht korrekt.

Da wäre es wichtig, wirklich zu vergleichen oder z.B. Integer.compare zu verwenden (So dies erlaubt ist).

Und wenn Du Strings vergleichen willst, dann bietet es sich natürlich an, die compare Methode zu nutzen. String implementiert Compareable<String> und hat daher eine String.compareTo Methode.
 
Also könnte ich dann theoretisch so machen:
Comparator<City> compareString = (a,b) -> a.getName().compareTo(b.getName());
cities.sort(compare);

Danke für deine Antwort
 
Moin, ich bin mir nicht ganz sicher aber wahrscheinlich ist das so gemeint:

Java:
import java.util.*;

class HelloWorld {
    private static Comparator < City > byCityDesc = (a, b) - > {
        return b.name.compareTo(a.name);
    };

    public static void main(String[] args) {
        ArrayList < City > cities = new ArrayList(List.of(new City("DD", 1108), new City("HH", 20099)));
        Collections.sort(cities, byCityDesc);
        System.out.println(cities);
    }
}

class City {
    public String name;
    public int postCode;
    public City(String name, int postCode) {
        this.name = name;
        this.postCode = postCode;
    }
    public String toString() {
        return "(" + postCode + " " + name + ")";
    }
}

Es ginge auch " return -a.name.compareTo(b.name);".

Oder sollt ihr Comparator chaining machen?

Ich hoffe ich konnte nützlich sein. =)
 
Vorausgesetzt, City hat eine Methode name(), beschreibt Comparator.comparing(City::name).reversed() sehr schön, was Sache ist.

Nachtrag: lese gerade, dass der TE einen Lambaausdruck haben will, dementsprechend wäre City::name natürlich durch city -> city.name zu ersetzen.
 
Das hast Du völlig recht: er soll den Comparator als (und nicht mit) Lambda-Ausdruck schreiben. Damit wäre Deine Version korrekt, denn Comparator.compring ist nun mal kein Lambda-Ausdruck.
Och... Ob nun einer als oder mit Lambda verstarb, nehme ich nicht so genau, Schnuppen bleibt Schnuppen 😁 😁 ... Soory, diese Metapher war unangebracht.

Viel wichtiger ist doch, dass morgen der heißeste Tag jemals werden könnte... Und wir sorgen uns um keine Heizung im Winter 💁‍♂️ Als hätten wir wegen des Klimawandels keine wichtigeren Sorgen 💁‍♂️

Dem Klima ist es egal, ob uns warm oder kalt ist, deshalb sollte alles lahmlegen nun oberste Priorität haben... 😉
 

Zurück
Oben