Wie Sortiere ich die enum-Mitglieder in alphabetischer Reihenfolge in Java?
Ich habe eine enum-Klasse wie die folgenden:
public enum Letter {
OMEGA_LETTER("Omega"),
GAMMA_LETTER("Gamma"),
BETA_LETTER("Beta"),
ALPHA_LETTER("Alpha"),
private final String description;
Letter() {
description = toString();
}
Letter(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
Später unten mein code, den ich im Grunde Durchlaufen der Brief enum und drucken Sie Ihre Mitglieder aus der Konsole:
for (Letter letter : Letter.values()) {
System.out.println(letter.getDescription());
}
Dachte ich, dass die Werte () - Methode würde mir eine bestellt Ansicht des enum (wie erwähnt hier), aber das ist hier nicht der Fall. Ich habe einfach die enum-Mitglieder in der Reihenfolge in der ich Sie erstellt in dem Brief enum-Klasse. Gibt es eine Möglichkeit, um die Ausgabe der Werte eines enum in alphabetischer Reihenfolge? Brauche ich einen separaten Komparator-Objekt, oder ist es eine integrierte Möglichkeit, dies zu tun? Grundsätzlich würde ich gerne die Werte werden alphabetisch sortiert, basierend auf der getDescription () - text:
Alpha
Beta
Gamma
Omega
Ich habe diesen link hier bei stackoverflow und arbeitete an mir. stackoverflow.com/a/18416259/6301287
InformationsquelleAutor denchr | 2009-11-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oder einfach nur die Reihenfolge der Deklarationen 🙂
Edit: Als KLE darauf hingewiesen, dies setzt Voraus, dass die Beschreibungen sind einzigartig in der enum.
Map
? Nichts geschieht mit den Schlüsseln, so dass es nicht tragen Sie sehr wohl die Absicht, nicht wahr? Mit einemSortedSet
(UmsetzungTreeSet
) entsprechen würde, besser. Aber die Einzigartigkeit charakterisiert, dass eineSet
(oder die Tasten einerMap
) nicht aufgeführte als requisite in der original-Beitrag, so dass ich vorschlagen, mit einem einfacher (und effizienter)List<String>
, gefolgt von einemCollections.sort()
nennen.Die Schlüssel sind sortiert, die Werte werden zurückgegeben. Die Frage heißt: "Grundsätzlich würde ich gerne die Werte werden alphabetisch sortiert, basierend auf der getDescription () - text:", also vielleicht drucken die enums ist nicht alles, was er im Sinn hat.
Vielen Dank für Ihre Wertschätzung. Wie ich sagte in meiner Antwort, das Wort "Wert" in der original-post ist nicht definiert, aber ich verstehe es als Wert des Beschreibung - Feld. In deinem code-Beispiel und dein Kommentar, übernehmen Sie "Wert" bedeutet
instance
. (Sicher, in meinem code, ich würde mit Ihnen einig ; aber für joel_nc ???)InformationsquelleAutor meriton
Genau, die Reihenfolge der Deklaration als signifikant für enums, also wir sind froh, dass Sie zurückgegeben werden, in genau dieser Reihenfolge. Zum Beispiel, wenn ein
int i
stellt eine enum-Werte, dabeivalues()[i]
ist eine sehr einfache und effiziente Weise zu finden, die enum-Instanz. Gehen entgegen-Weise, dieordinal()
- Methode gibt den index eines enum-Instanz.Was Sie nennen Wert ist nicht etwas, was definiert für Enumerationen im Allgemeinen. Hier, in Ihrem Kontext, die Sie bedeuten, das Ergebnis des
getDescription()
.Wie Sie sagen, könnten Sie erstellen Sie einen Komparator für diese Beschreibungen. Das wäre perfekt 🙂
Beachten Sie, dass im Allgemeinen, Sie brauchen könnten mehrere Aufträge für diese Fälle:
Könnten Sie auch drängen, dass die Vorstellung von DescriptionComparator ein wenig:
Aus Gründen der Leistung, die Sie speichern könnte die berechnete Beschreibungen.
Weil enums können nicht Erben, die die Wiederverwendung von code muss außerhalb der enum-Klasse. Lassen Sie mich das Beispiel verwenden wir in unseren Projekten:
Nun die code-Beispiele...
Beachten Sie, dass die generischen code in
EnumUtils
funktioniert nicht nur für ein enum-Klasse, aber funktioniert für jede enum-Klasse in Ihr Projekt implementiert, dass dasDescribed
Schnittstelle.Wie gesagt, der Punkt, der mit dem code außerhalb des enums (wo es sonst gehören) ist es, den code wiederverwenden. Es ist keine große Sache für zwei enums, aber wir haben über tausend Enumerationen, die in unserem Projekt, viele von Ihnen mit den gleichen Schnittstellen...!
InformationsquelleAutor KLE
Nur Sortieren mit Arrays.Sortieren und Ihren eigenen Komparator.
InformationsquelleAutor Dmitry
Hier ist eine generische Art und Weise, es zu tun mit jeder Klasse ohne Implementierung Vergleichbar auf die Klasse, die Sie sind, Sortieren oder erstellen Sie eine benutzerdefinierte Komparator. Ich habe gefunden Instanzen, wo ich nicht überschreiben wollen compareTo denn es dient einem anderen Zweck, Sie können nicht für Enumerationen sowieso, und ständig erstellen von wrapper-Klassen ist ein Schmerz. Sie können übergeben Sie eine Funktion, die Ausgänge ein Vergleichbares Objekt, das Sie verwenden möchten für Sortier-Zwecke.
Den toComparable Funktion wird nur aufgerufen, einmal pro element in der Liste (nicht so für eine benutzerdefinierte Komparator), so ist es besonders gut, wenn dieser Aufruf ist teuer für einige Klassen. Null-Werte werden intern abgewickelt, so dass es einfacher zu bedienen als eine benutzerdefinierte Komparator. Ein Aufruf von Java 7 ist TimSort Algorithmus wesentlich effizienter als ein Haufen von O(log N) INSERT, um eine SortedMap (rot-schwarz-Baum oder anderen balancierten Baum-Implementierung). Und Sie sind nicht beschränkt auf eine bestimmte Klasse oder ein interface.
Real world performance steigt signifikant sind, in vielen Fällen. Zum Beispiel, die performance-Steigerung ist etwa 5x so schnell wie mit einem Komparator beim Sortieren Doppelzimmer mit toString() auf eine Liste der Größe 100k.
InformationsquelleAutor pscuderi