Wie richtig initialisiert werden einem Komparator?
Schreiben brauche ich eine statische Methode in einer Klasse MinTester berechnet, dass das "kleinste" string
aus einer ArrayList-Auflistung mit einem comparator-Objekt:
public static String min(ArrayList<String> list, Comparator<String> comp)
Kann ich nicht verwenden, der Collections-Klasse zu berechnen, die minimale.
Hier ist was ich habe, so weit.
public class MinTester
{
public static String min(ArrayList<String> list, Comparator<String> comp)
{
String shortest = list.get(0);
for(String str : list) {
if ( comp.compare(str, shortest) < 0) {
shortest = str;
}
}
return shortest;
}
}
Ich bin nicht immer alle Fehler, die hier von der Methode, So dass ich versuchen, es zu testen in Main mit.
Ich bekomme diese Fehlermeldung, wenn Sie versuchen, um pass comp: Variable comp kann nicht initialisiert wurden
public static void main(String[] args)
{
//TODO code application logic here
MinTester s = new MinTester();
Comparator<String> comp;
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
String a = s.min(list,comp);//Error: Variable comp may not have been initialized
System.out.println(a);
}
Heres, wo ich mein problem.
Ich versuche
Comparator<String> comp = new Comparator<>();//Error:Comparator is abstract, cannot be instantiated
Comparator<String> comp = new MinTester();//Error: MinTester cannot be converted to Comparator<String>
Kann mir jemand sagen, der richtige Weg, um dies zu umgehen Komparator? Im nicht sicher, wenn ich nur versucht Sie zu initialisieren falsch, oder wenn ich ' m fehlt etwas in meinem MinTester Klasse.
Sie haben nicht definiert, was Sie meinen "kleinsten". Sie implizieren in Ihrem code, dass du meinst, "kürzeste", aber ich vermute, die definition ist etwas komplexer, wie in "der kürzeste, aber im Fall von einem Band, das Sortieren nach Charakter-Sortierung der Reihenfolge (d.h. alphabetisch nach Buchstaben)". Sobald Sie wissen, dass, implementieren
Comparator<String>
.
InformationsquelleAutor Reeggiie | 2014-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Sie eine Klasse, die
Comparator<String>
. Eine schnelle Vorgehensweise mit anonyme Klasse:Seit Sie brauchen, um zu vergleichen, basierend auf der Länge der Zeichenfolge, ändern Sie einfach die Vergleich-Logik in der
compare
Methode:Wenn Sie geschehen, um die Nutzung von Java 7, dann verwenden Sie
Integer#compare
:Wenn Sie die Verwendung von Java 8 Sie können einen lambda-Ausdruck:
Comparator
ist eine Schnittstelle. Es sollte 'umgesetzt', die nicht verlängert werden.richtig, es behoben.
Ich habe versucht, und meine Ausgabe für einen zu sein scheint, basiert nach alphabetischer Reihenfolge, nicht zu vergleichen Längen. Wenn ich 'b' und 'abc', a = abc da a vor b kommt. Ich würde versuchen, es Bearbeiten, aber ich bin nicht sicher, wie das die anonyme Methode geht hand in hand mit der Methode von meinem MinTester Klasse
Dann tauschen Sie die Körper der compare-Methode durch den code vergleicht die Länge des strings. Sollte nicht länger sein, dass die 1.Zeile.
Sie müssen nur ersetzen, die genau die gleiche Zeile, wo Sie
String a = s.min(list, comp);
. Wenn Sie brauchen, um zu vergleichen, durch die Länge der Zeichenfolge, dann ändern Sie die Implementierung.InformationsquelleAutor Luiggi Mendoza
Comparator
ist eine Schnittstelle; verschiedene Klassen implementieren können es in verschiedenen Möglichkeiten, um verschiedene Arten von vergleichen. Der Grund, warum Sie Ihre Methode nimmt einenComparator
ist, so dass der Anrufer auswählen kann, wie die strings verglichen werden soll. Pass in einemComparator
bedeutet, dass lexikalische (aka alphabetisch) Vergleich, und du wirst der erste string lexikalisch. Pass in einemComparator
das sieht bei der Länge der Zeichenfolge, und Sie erhalten die kürzesten string.Da die
String
schon Klasse, implementiert dieComparable
interface — eine Art Geschwister zuComparator
können Sie eine Klasse definieren, die Ihre eigenen Vergleich-Methode — hier ist eine praktische generische Klasse, die ermöglicht die Verwendung jedesComparable
durch dieComparator
Schnittstelle:Pass einer von denen in der Methode, und es werden die Zeichenfolgen verglichen mit der
String
Klasse eigenecompareTo
Methode.Edit: In Java 8 oder höher, die
Komparator.naturalOrder()
Methode gibt Ihnen die gleiche Sache, so brauchen Sie nicht zu schreiben der obigen Klasse.InformationsquelleAutor Wyzard
Brauchen Sie nicht zu verwenden
Comparator
zumindest nicht, es sei denn, Sie möchten, ändern Sie die Natürliche Reihenfolge der string-Vergleiche. Verwenden Sie diecompareTo()
Methode für dieString
Klasse statt.Wenn Sie möchten, ändern Sie die Natürliche der Bestellung, können Sie eine Klasse erstellen, die sich um die
Comparator
- Schnittstelle und übergeben Sie dann eine Instanz dieser Klasse, um diecompare()
Methode. Sie können auch festlegen, Ihre eigene Logik für die Vergleiche.Dann können Sie eine Instanz der obigen Klasse zu vergleichen, in der absteigenden Reihenfolge:
"b" < "a"
Comparator
ist eine Voraussetzung. (Das klingt wie eine Schule Zuordnung.)Das ist richtig
Ohh! Dann können Sie die
Comparator
Klasse in meine Antwort mit der return-Anweisung alsreturn str1.compareTo(str2);
zur Erhaltung der natürlichen BestellungInformationsquelleAutor Kedarnath Calangutkar