Wie definieren Komparator auf SortedSet<> wie TreeSet<>?
Ich möchte eine lexikalische sortierte Liste von strings, also ging ich mit der basic SortedSet
1) Set<String> words = new SortedSet<String>(){}
und erkannte, dass SortedSet ist eine abstrakte Klasse, in die ich implementieren müssen, um die comapartor Methode. Also ging ich und suchte bei google und fand heraus, dass treeSet ist besser und ich kann mit dem vordefinierten Komparator-Methode.
2) SortedSet<String> words = new TreeSet<String>(){}
Wenn Sie ging, um java-docs erkannte ich, dass TreeSet extends AbstractSet eher als SortedSet. Frage 1 - Kann mir jemand erklären, wie die 2. Zeile ist noch arbeiten(wie ich es bin nicht ich verallgemeinere das Set, die ich normalerweise tun würde, stattdessen bin ich mit zwei völlig verschiedenen Klassen keine Parent-child-Beziehung).
Frage 2 - wie definieren Komparator von SortedSet, die Arbeit als TreeSet. So, hier ist der funktionierende code mit TreeSet
SortedSet<String> words = new TreeSet<>();
Scanner scanner1 = new Scanner(System.in);
String s1 = scanner1.nextLine();
int a = scanner1.nextInt();
while(s1.length()>a){
words.add(s1.substring(0,a));
s1 = s1.substring(a);
}
Iterator itr = words.iterator();
while(itr!= null&&itr.hasNext()){
System.out.println(itr.next());
}
Normalen Eingang
welcometojava
3
Erwartete Ausgabe
com
eto
jav
wel
Bearbeiten-1
Für die Antwort auf Frage 2, ich erwarte so etwas
Set<String> words = new SortedSet<String>() {
@Override
public Comparator<? super String> comparator() {
return null;
}
......
Ich im Grunde lernen wollen, wie man ein basic-Komparator "wie" in TreeSet während der Verwendung SortedSet? Ich verstehe, dass, wenn es natürlich ist, Bestell ich brauche nicht zu definieren, eine neue Komparator.
- Habe die Antwort auf die erste Frage. Jetzt müssen die Antwort auf die zweite Frage.
- Möglich, Duplikat der Was ist der Unterschied zwischen interface und abstrakter Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort 1:
TreeSet<T>
implementiert dieNavigableSet<T>
- Schnittstelle, die sichSortedSet<T>
, die erstreckt sich auchSet<T>
.Die Schnittstellen, die sich eigentlich nicht für die Sortierung, die konkrete Klasse.
Also:
Würden Sie noch in sortierter Reihenfolge.
Antwort 2:
Erstens, für Klassen, die bereits implementiert
Comparable<T>
, kann man auch weglassenComparator
für dieTreeSet
als "Natürliche die Bestellung" ist gemeint, dass durch die Verwendung derComparable<T>
'scompareTo
Methode.Ansonsten Sie können eine
Comparator
Instanz als die TreeMap Konstruktor ersten argument:oder verwenden Sie Java 8 Lambdas:
Ihre Frage zu beantworten,
TreeSet implementiert auch NavigableSet die sich SortedSet
Standardmäßig die Sortierung erfolgt basierend auf dem natürlichen Bestellung und die primitive-Wrapper (
Integer, Long, ...
) implementiertComparable
- Schnittstelle, so dass keine Notwendigkeit zur Umsetzung derComparable
wenn die Sammlung enthält Wrapper der Primitiven und natürlichen Bestellung wird voraussichtlichAber in Ihrer benutzerdefinierten Klasse implementieren sollte Vergleichbar wenn es bestellt werden soll, in
TreeSet
sonstClassCastException
wird geworfen, sobald Sie das zweite elementSortedSet<T>
ist nicht eine abstrakte Klasse, es ist ein interface.TreeSet<T>
tut implementierenSortedSet<T>
, aber nicht direkt: die Kette der Vererbung geht wie folgt:Set<T>
-SortedSet<T>
-NavigableSet<T>
Deshalb ist die Zuordnung
SortedSet<String> words = new TreeSet<String>()
funktioniert:TreeSet<T>
ist einNavigableSet<T>
, undNavigableSet<T>
ist einSortedSet<T>
, so gilt die Abtretung rechtmäßig ist.Wenn Sie nicht liefern einen expliziten comparator,
TreeSet<T>
's verwendet Natürliche der Bestellung geliefertT
's Umsetzung vonComparable<T>
.TreeSet implementiert NavigableSet, die wiederum erstreckt sich SortedSet, das ist der Grund, warum die Linie 2) arbeitet. Sehen TreeSet Java-doc.
Für den zweiten Teil, versuchen Sie dies: