Hi, ich soll ein comparator attribut, mit Comparator<String> anlegen, damit meint man wahrscheinlich eine anonyme klasse oder?
Zuletzt bearbeitet:
Also ich bin mir jetzt nicht ganz sicher, was da gefordert ist. Ein Attribut ist erst einmal nur eine Instanzvariable, also sowas wie:Hi, ich soll ein comparator attribut, mit Comparator<String> anlegen, damit meint man wahrscheinlich eine anonyme klasse oder?
Comparator<String> someComparator;
Comparator<String> someComparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// Code ...
}
};
Comparator<Test> someComparator = Comparator
.comparing(Test::getSomeAttribute)
.thenComparing(Test::getSomeOtherAttribute);
Danke, ich soll die String lexikalisch vergleichen, wenn ich nun z. B. den comparator als anonyme Klasse nutze und dann die Methode compare verwende, muss die selber noch definieren also was in compare passiert? Wenn ja, warum sollte ich dann einen COmparator verwenden, wenn ich selber schreiben muss, wie der Vergleiuch funktioniert, da kann ich doch gleich einfach eine Methode erstellen ode rnicht?Also ich bin mir jetzt nicht ganz sicher, was da gefordert ist. Ein Attribut ist erst einmal nur eine Instanzvariable, also sowas wie:
Comparator<String> someComparator;
Das kann man jetzt natürlich auf viele Wege mit Inhalt füllen. Ein Weg dabei ist durchaus die Anonyme Klasse, die dann so aussehen könnte:
Java:Comparator<String> someComparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { // Code ... } };
Dieser Aufbau ist aber seit Java 8 veraltet. Das Comparator Interface hat nur eine Methode und damit ist es ein funktionales Interface. Daher kann man das entsprechend auch mit Methodenreferenzen oder per Lambda Ausdruck füllen.
Und natürlich gibt es da auch genug einfache Wege, wie man etwas aufbauen kann. So bietet Comparator einige Möglichkeiten, die dann so in der Form aussehen könnten:
Was dann ein Comparator für eine Klasse Test erstellt und dabei wird erst verglichen, was getSomeAttribute zurück gibt und wenn das gleich war, dan wird getSomeOtherAttribute geprüft.Java:Comparator<Test> someComparator = Comparator .comparing(Test::getSomeAttribute) .thenComparing(Test::getSomeOtherAttribute);
Das wird jetzt ggf. etwas über das hinaus gegangen sein, was ihr bisher hattet aber zum einen weiss ich nicht, wie vciel ihr schon gelernt habt und zum anderen ist es aus meiner Sicht wichtig, dass man relativ schnell lernt, die Möglichkeiten, die es so gibt, auch zu nutzen.
Comparator<String> someComparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// Also muss ich hier noch selber schreiben, wie genau der Vergleich, den ich will funktioniert? Wenn ja wozu benötigt man ein comparator, da kann ich doch gleich eine MEthode einfach erstellen und meinen VErgleich definieren?
}
};
Natürlich kannst du eine Methode definieren, welche Strings vergleicht. Fraglich ist nur was dir dieser Vergleich dann nützt. Willst du bspw. mit Hilfe des Vergleichs eine Liste sortieren, muss du die Sortierung dann auch noch programmieren. Es geht aber einfacher mit bereits fertigen Methoden, zB.:warum sollte ich dann einen COmparator verwenden,
Collections.sort(list, comparator);
"lexikalisch" bedeutet nach der Bedeutung des Wortes zu sortieren. Ich glaube nicht, dass das von dir gefordert wird. das ist sehr komplex. Strings mit natürlichsprachlicher Bedeutung kann man je nach Sprache mit einem Collator vergleichen, auch das gibt es schon fertigString lexikalisch vergleichen
Collator.getInstance(Locale.GERMAN)
Okay, danke, wenn ich nun über die anonyme Klasse die Methode definiert habe, wie nutze ich diese Methode? Wie kann ich über die Anonymeklasse darauf zugreifen?Natürlich kannst du eine Methode definieren, welche Strings vergleicht. Fraglich ist nur was dir dieser Vergleich dann nützt. Willst du bspw. mit Hilfe des Vergleichs eine Liste sortieren, muss du die Sortierung dann auch noch programmieren. Es geht aber einfacher mit bereits fertigen Methoden, zB.:
Wie du siehst ist hier die Sortierung einer Liste für dich fix und fertig programmiert. Alles was du noch brauchst ist eine Methode für den Vergleich. Comparator stellt diese Methode zur Verfügung und erzwingt die Implementierung.Java:Collections.sort(list, comparator);
"lexikalisch" bedeutet nach der Bedeutung des Wortes zu sortieren. Ich glaube nicht, dass das von dir gefordert wird. das ist sehr komplex. Strings mit natürlichsprachlicher Bedeutung kann man je nach Sprache mit einem Collator vergleichen, auch das gibt es schon fertig
und du musst dir darum keine Gedanken machen.Java:Collator.getInstance(Locale.GERMAN)
Comparator bietet aber den Vorteil, das du deine ganz persönlich Sortierung erzwingen kannst.
Comparator<String> someComparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// Also muss ich hier noch selber schreiben, wie genau der Vergleich, den ich will funktioniert? Wenn ja wozu benötigt man ein comparator, da kann ich doch gleich eine MEthode einfach erstellen und meinen VErgleich definieren?
}
};
int result = someComparator.compare("A", "B");
Genau, mein Problem ist nur, dass ich die anonyme Klasse als private habe und in einer anderen Klasse nutzen muss?Auf eine Methode greift man über ihren Namen zu:
Java:Comparator<String> someComparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { // Also muss ich hier noch selber schreiben, wie genau der Vergleich, den ich will funktioniert? Wenn ja wozu benötigt man ein comparator, da kann ich doch gleich eine MEthode einfach erstellen und meinen VErgleich definieren? } };
Aber normalerweise musst du das nicht selbst aufrufen.Java:int result = someComparator.compare("A", "B");
Das frage ich mich ehrlich gesagt auch.Dann überlege was du über Sichtbarkeit und Get- und Set-Methoden gelernt hast. Irgendwie hört sich das aber komisch an. Warum sollte man eine anonyme Klasse in Klasse A erstellen wenn man diese in Klasse B braucht? Erstelle doch gleich eine reguläre Klasse oder Singelton, die du instanziieren kannst wo du sie brauchst.
Comparator<String> someComparator = String::compareTo;
siehe: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.htmlWisst ihr zufällig was damit gemeint ist, dass man einen Stringarray mit dem set interface zurückgeben soll?