Hier ist mein Problem - ich suche (falls es überhaupt existiert) das Enum-Äquivalent von ArrayList.contains();
.
Hier ist ein Beispiel für mein Codeproblem:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Jetzt ist mir klar, dass ein ArrayList
von Strings
hier der bessere Weg wäre, aber ich muss meinen Enum-Inhalt durch einen Schalter / Fall an einer anderen Stelle laufen lassen. Daher mein Problem.
Angenommen, so etwas gibt es nicht. Wie könnte ich das tun?
Antworten:
Dies sollte es tun:
Auf diese Weise müssen Sie sich später keine Gedanken mehr über das Hinzufügen zusätzlicher Aufzählungswerte machen. Alle werden überprüft.
Bearbeiten: Wenn die Aufzählung sehr groß ist, können Sie die Werte in ein HashSet einfügen:
Dann können Sie einfach Folgendes tun:
values.contains("your string")
was true oder false zurückgibt.quelle
Verwenden Sie stattdessen die Apache Commons Lang3 Lib
quelle
Sie können verwenden
Enum.valueOf()
Wenn Sie erwarten, dass die Prüfung häufig fehlschlägt, ist es möglicherweise besser, eine einfache Schleife zu verwenden, wie andere gezeigt haben. Wenn Ihre Aufzählungen viele Werte enthalten , konvertieren Sie möglicherweise Builda
HashSet
oder ähnliche Ihrer Aufzählungswerte in eine Zeichenfolge und fragen Sie diese abHashSet
.quelle
EnumUtils.isValidEnum(MyEnum.class, myValue)
verwendet eine ähnliche Logik und IMO ist es sinnvoll, eine ganze Bibliothek für diese triviale AufgabeWenn Sie Java 1.8 verwenden, können Sie Stream + Lambda auswählen, um dies zu implementieren:
quelle
Guavas Enums könnte dein Freund sein
Wie zB das:
quelle
Noch besser:
quelle
Sie können zuerst die Aufzählung in Liste konvertieren und dann die Methode Liste enthält verwenden
quelle
Ein paar Bibliotheken wurden hier erwähnt, aber ich vermisse die, nach der ich eigentlich gesucht habe: Frühling!
Es gibt die ObjectUtils # includesConstant, bei der die Groß- und Kleinschreibung standardmäßig nicht berücksichtigt wird, die jedoch bei Bedarf streng sein kann. Es wird so verwendet:
Hinweis: Ich habe hier die überladene Methode verwendet, um die Verwendung der Groß- und Kleinschreibung zu demonstrieren. Sie können den Booleschen Wert weglassen, um die Groß- und Kleinschreibung nicht zu berücksichtigen.
Seien Sie jedoch vorsichtig mit großen Aufzählungen, da diese die Map-Implementierung nicht wie manche verwenden ...
Als Bonus bietet es auch eine Variante von valueOf: ObjectUtils # caseInsensitiveValueOf, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird
quelle
Einige Annahmen:
1) Kein Versuch / Fang, da es sich um eine außergewöhnliche Flusskontrolle handelt.
2) Die Methode "enthält" muss schnell sein, da sie normalerweise mehrmals ausgeführt wird.
3) Der Platz ist nicht begrenzt (üblich für gewöhnliche Lösungen)
quelle
Sie können dies verwenden
YourEnum {A1, A2, B1, B2}
Das von @ wightwulf1944 vorgeschlagene Update wurde integriert, um die Lösung effizienter zu gestalten.
quelle
stream()
werden. Wenn Sie einen Satz verwenden, iterieren Sie für jedes Element im Satz, anstatt die zugrunde liegende Hashtabelle zu nutzen, die schneller ist. Um dies zu verbessern, ist es am besten, das erstellte Set zwischenzuspeichern undcontains()
stattdessen seine Methode zu verwenden. Wenn Sie einen Stream erhalten müssen, verwenden SieArrays.stream()
stattdessen.Ich glaube nicht, aber Sie können so etwas tun:
Bearbeiten:
Bitte lesen Sie Richards Version davon, da dies angemessener ist, da dies nur funktioniert, wenn Sie es in Strings konvertieren, was Richards tut.
quelle
.values()
unter download.oracle.com/javase/6/docs/api/java/lang/Enum.html nicht dokumentiert ?Java Streams bietet eine elegante Möglichkeit, dies zu tun
Rückgabe: true, wenn Elemente des Streams mit dem angegebenen Wert übereinstimmen, andernfalls false
quelle
Warum nicht Pablos Antwort mit einem valueOf () kombinieren?
quelle
Dieser Ansatz kann verwendet werden, um alle zu überprüfen
Enum
. Sie können ihn einerUtils
Klasse hinzufügen :Verwenden Sie es so:
quelle
Ich habe die nächste Klasse für diese Validierung erstellt
Anwendungsbeispiel:
quelle
Sie können verwenden,
valueOf("a1")
wenn Sie nach String suchen möchtenquelle
Es ist eine Aufzählung, das sind konstante Werte. Wenn es also in einer switch-Anweisung steht, macht es einfach so etwas:
Warum sollten Sie auch wissen müssen, was als Konstante deklariert ist?
quelle
Mit Guave ist es noch einfacher:
quelle
MyEnum.values()
Gibt ein Array von MyEnum-Instanzen zurück undMyEnum.value().toString()
gibt eine Zeichenfolgendarstellung dieses Array-Objekts zurück (nur Zeichenfolge wie "[LMyEnum; @ 15b94ed3").name()
statt aufrufen.toString()
(es sei denn, Sie überschreiben die Standardmethode toString). Weitere Informationen finden Sie hier: Unterschied zwischen enum .name () und .toString ()Dies kombiniert alle Ansätze früherer Methoden und sollte eine gleichwertige Leistung aufweisen. Es kann für jede Aufzählung verwendet werden, fügt die "Edit" -Lösung von @Richard H ein und verwendet Ausnahmen für ungültige Werte wie @bestsss. Der einzige Nachteil ist, dass die Klasse angegeben werden muss, aber dies macht dies zu einem Zweiliner.
}}
quelle
quelle
Lösung, um zu überprüfen, ob auch ein Wert vorhanden ist.
quelle
Dieser funktioniert für mich:
quelle
Wenn Sie Java 8 oder höher verwenden, können Sie dies tun:
quelle
quelle
Sie können es als enthält-Methode erstellen:
oder Sie können es einfach mit Ihrem Codeblock verwenden:
quelle
Sie können auch Folgendes verwenden: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) gibt eine Option zurück
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
quelle
Ich würde einfach schreiben,
Enum # equals funktioniert nur mit Objektvergleich.
quelle
quelle
enum
sind in Java ziemlich mächtig. Sie könnencontains
Ihrer Aufzählung ganz einfach eine Methode hinzufügen (wie Sie einer Klasse eine Methode hinzufügen würden):quelle
s.equals("b1") || s.equals("b2")
?s.equals("xx")
für jede Aufzählung, die Sie später hinzufügen, neue hinzufügen müssen.