Comment trier les membres d'enum par ordre alphabétique en Java?
J'ai un enum class comme suit:
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;
}
}
Plus tard en bas de mon code, j'ai pratiquement itérer sur la Lettre enum et imprimer ses membres à la console:
for (Letter letter : Letter.values()) {
System.out.println(letter.getDescription());
}
Je pensais que les valeurs de() la méthode pourrait me donner un ordre de vue de l'enum (comme mentionné ici), mais ce n'est pas le cas ici. J'ai tout simplement obtenir l'énumération des membres dans l'ordre que j'ai créé dans la Lettre enum class. Est-il un moyen de sortie les valeurs d'une énumération dans l'ordre alphabétique? Ai-je besoin d'une référence distincts de l'objet, ou est-il intégré dans la façon de le faire? Fondamentalement, je voudrais les valeurs qui doivent être triés par ordre alphabétique basé sur la getDescription() texte:
Alpha
Beta
Gamma
Omega
source d'informationauteur denchr
Vous devez vous connecter pour publier un commentaire.
Ou tout simplement réorganiser les déclarations 🙂
Edit: Comme KLE souligné, cela suppose que les Descriptions sont uniques au sein de l'enum.
Précisément, l'ordre de déclaration est considérée comme significative pour les enums, donc nous sommes heureux qu'ils sont retournés là, dans l'ordre. Par exemple, lorsqu'un
int i
représente une des valeurs enum, fairevalues()[i]
est un moyen très simple et efficace pour trouver l'enum instance. Aller à l'encontre des sages, leordinal()
méthode renvoie l'index d'un enum instance.Ce que vous appelez valeur n'est pas quelque chose de défini pour les enums en général. Ici, dans votre contexte, vous dire que le résultat de
getDescription()
.Comme vous le dites, vous pourriez créer un Comparateur pour ces descriptions. Qui serait parfait 🙂
Remarque qu'en général, vous pourriez avoir besoin de plusieurs ordres de ces instances:
Vous pouvez aussi pousser la notion de DescriptionComparator un peu:
Pour des raisons de performances, vous pouvez stocker le résultat de descriptions.
Parce que les énumérations peuvent pas hériter, la réutilisation de code doit être à l'extérieur de la classe enum. Permettez-moi de donner l'exemple nous utilisons dans nos projets:
Maintenant les exemples de code...
Noter que le générique de code dans
EnumUtils
ne travaille pas seulement pour un enum class, mais fonctionne pour n'importe quel enum classe dans votre projet met en œuvre laDescribed
interface.Comme dit avant, le point d'avoir le code en dehors de la énumérations (où il serait autrement appartiennent) est de réutiliser le code. Ce n'est pas une grosse affaire pour les deux énumérations, mais nous avons plus d'un millier d'énumérations dans notre projet, beaucoup d'entre eux avec les mêmes interfaces...!
Juste de les trier à l'aide de Tableaux.de tri et de votre propre comparateur.
Voici un générique façon de le faire avec toute la classe, sans avoir à mettre en œuvre Comparable sur la classe que vous soyez de tri ou de créer un comparateur. J'ai trouvé des cas où je ne veux pas remplacer compareTo parce qu'elle sert un but différent, vous ne pouvez pas pour les énumérations, de toute façon, et ne cesse de créer des classes wrapper est une douleur. Vous pouvez passer d'une fonction qui génère un Comparable de l'objet que vous souhaitez utiliser à des fins de tri.
La toComparable fonction n'est appelée qu'une fois par élément dans la liste (pas tellement pour une mesure de comparaison), il est donc particulièrement bonne si cet appel est cher pour un peu de classe. Les valeurs Null sont gérées en interne, de sorte qu'il est plus facile à utiliser qu'une coutume comparateur. Un appel à Java 7 TimSort algorithme est considérablement plus efficace que de faire un tas de O(log N) insère un SortedMap (rouge-noir arbres ou d'autres équilibrée de l'arbre de la mise en œuvre). Et vous n'êtes pas limités à un particulier de la classe ou de l'interface.
Monde réel augmente les performances sont importantes dans de nombreux cas. Par exemple, l'augmentation de la performance est d'environ 5x aussi rapide que d'utiliser un comparateur de tri de Doubles à l'aide de toString() sur une liste de taille 100.