Java de Tri basé sur le protocole Enum constantes
Nous avons un enum
enum listE {
LE1,
LE4,
LE2,
LE3
}
En outre, nous avons une liste qui contient les chaînes ["LE1","LE2","LE3","LE4"]
. Est-il un moyen pour trier la liste en fonction de l'enum ordre défini (pas le naturel String
commande).
La liste triée devrait être ["LE1", "LE4", "LE2", "LE3"]
.
Vous devez vous connecter pour publier un commentaire.
Enum<E>
implémenteComparable<E>
par l'ordre naturel de l'enum (l'ordre dans lequel les valeurs sont déclarées). Si vous venez de créer une liste de valeurs enum (au lieu de chaînes de caractères) par l'intermédiaire de l'analyse, puis trier cette liste en utilisantCollections.sort
, il devrait régler la façon dont vous le souhaitez. Si vous avez besoin d'une liste de chaînes, de nouveau, il vous suffit de convertir en arrière en appelantname()
sur chaque élément.values()
méthode retourne dans l'ordre dans lequel il est défini.Sortie
Je l'ai utilisée à la suite de faire le tri dans mes
List<theEnum>
dans un ordre croissant, et il a bien fonctionné pour moi.sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
pour tous x et y", qui ne parvient pas pour le cas oùx==y
, resp. dans ce casthis==s1
. Aussi, lethis!=s1
cas est plus facile et moins sujettes à l'erreur de mettre en œuvrereturn this.studentDays.compareTo(s1.studentDays)
.vous devriez probablement regarder à l'ordinal() la méthode de l'énumération, il renvoie un Entier de la position de la enum type apparaît dans l'énumération de la classe, donc dans votre cas LE1 = 0, LE4 = 1, etc...
Chaque constante enum a un ordinal valeur correspondant à sa position dans la déclaration d'enum. Vous pouvez écrire un comparateur pour vos chaînes à l'aide de la valeur ordinale de l'correspondant constante enum.
Si vous voulez ordre de tri différent alors fournis dans
Enum
classe et vous ne pouvez pas modifié assignéint
à votre champs de type enum et comparer:et ensuite utiliser
Essayez d'utiliser :
ajouter enum champ(champ trié)
comme
Utilisation
TreeSet
Mettre en œuvre
Comparator
à l'aide deMyEnum.sorted
déposéSi vous wan à trier par ordinale vous pouvez utiliser
valueOf
pour convertir la chaîne et l'ajouter à un EnumSet (qui est triée par ordinal)Sinon, vous pouvez trier les valeurs en fonction d'un attribut de l'enum. (Cela peut être plus robuste et ne dépendant pas de l'ordre, les enums sont déclarées) Utilisation valueOf et écrire une coutume Comparateur.
De Jon réponse est correcte par le cahier des charges:
Cependant, je voulais laisser un Java8 exemple dans le cas où quelqu'un veut cartographier la chaîne de valeurs de l'enum et les trier par l'énumération de l'ordre. Avec cela, vous pouvez mapper vos chaînes enum, trier en utilisant la valeur par défaut comparables, et ensuite une carte par le biais d'un
toString
. Cela vous laisse avec quelque chose comme ceci:Le résultat serait: