Oto mój problem - szukam (jeśli w ogóle istnieje) odpowiednika enum ArrayList.contains();
.
Oto próbka mojego problemu z kodem:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Teraz zdaję sobie sprawę, że opcja ArrayList
of Strings
byłaby tutaj lepszą trasą, ale muszę uruchomić zawartość wyliczenia za pomocą przełącznika / przypadku w innym miejscu. Stąd mój problem.
Zakładając, że coś takiego nie istnieje, jak mam się do tego zabrać?
Odpowiedzi:
To powinno wystarczyć:
W ten sposób nie musisz się martwić o późniejsze dodanie dodatkowych wartości wyliczenia, wszystkie są sprawdzane.
Edycja: Jeśli wyliczenie jest bardzo duże, możesz umieścić wartości w HashSet:
Następnie możesz po prostu zrobić:
values.contains("your string")
co zwraca prawdę lub fałsz.źródło
Zamiast tego użyj biblioteki Apache commons lang3
źródło
Możesz użyć
Enum.valueOf()
Jeśli spodziewasz się, że sprawdzanie często kończy się niepowodzeniem, lepiej byłoby użyć prostej pętli, jak pokazały inne - jeśli twoje wyliczenia zawierają wiele wartości, być może builda
HashSet
lub coś podobnego z twoich wartości wyliczeniowych przekonwertowanych na ciąg i zapytaj o toHashSet
.źródło
EnumUtils.isValidEnum(MyEnum.class, myValue)
używa podobnej logiki i IMO, warto dodać całą bibliotekę do tego trywialnego zadaniaJeśli używasz Java 1.8, możesz wybrać Stream + Lambda, aby zaimplementować to:
źródło
Nawet lepiej:
źródło
Guavas Enums może być twoim przyjacielem
Na przykład to:
źródło
Możesz najpierw przekonwertować wyliczenie na List, a następnie użyć metody list zawiera
źródło
Wspomniano tutaj o kilku bibliotekach, ale tęsknię za tą, której tak naprawdę szukałem: Wiosna!
Istnieje ObjectUtils # includesConstant, która domyślnie nie rozróżnia wielkości liter, ale może być ścisła, jeśli chcesz. Jest używany w następujący sposób:
Uwaga: użyłem tutaj przeciążonej metody, aby zademonstrować, jak używać sprawdzania wielkości liter. Możesz pominąć wartość logiczną, aby zachowanie nie uwzględniało wielkości liter.
Uważaj jednak na duże wyliczenia, ponieważ nie używają implementacji Map, jak niektórzy ...
Jako bonus zapewnia również wariant valueOf: ObjectUtils # caseInsensitiveValueOf niewrażliwy na wielkość liter
źródło
Kilka założeń:
1) Brak try / catch, ponieważ jest to wyjątkowa kontrola przepływu
2) Metoda „zawiera” musi być szybka, ponieważ zwykle jest wykonywana kilka razy.
3) Przestrzeń nie jest ograniczona (typowe dla zwykłych rozwiązań)
źródło
Możesz tego użyć
YourEnum {A1, A2, B1, B2}
Aktualizacja sugerowana przez @ wightwulf1944 została uwzględniona, aby zwiększyć wydajność rozwiązania.
źródło
stream()
na zestawie oznacza, że wykonujesz iterację na każdym elemencie w zestawie, zamiast korzystać z bazowej tablicy hashy, która będzie szybsza. Aby to poprawić, najlepiej buforować utworzony Zestaw icontains()
zamiast tego użyć jego metody. Jeśli musisz pobrać strumień, użyjArrays.stream()
zamiast tego.Myślę, że tak nie jest, ale możesz zrobić coś takiego:
Edytować:
Zapoznaj się z wersją Richarda, ponieważ jest bardziej odpowiednia, ponieważ nie zadziała, chyba że przekonwertujesz go na użycie ciągów, co robi Richards.
źródło
.values()
udokumentowane na download.oracle.com/javase/6/docs/api/java/lang/Enum.html ?Strumienie Java zapewniają elegancki sposób na zrobienie tego
Zwraca: prawda, jeśli którykolwiek element strumienia pasuje do podanej wartości, w przeciwnym razie fałsz
źródło
Dlaczego nie połączyć odpowiedzi Pabla z wartością valueOf ()?
źródło
To podejście można wykorzystać do sprawdzenia dowolnego
Enum
, możesz dodać go doUtils
klasy:Użyj tego w ten sposób:
źródło
Stworzyłem następną klasę do tej walidacji
przykład użycia:
źródło
Możesz użyć,
valueOf("a1")
jeśli chcesz wyszukać ciąg znakówźródło
Jest to wyliczenie, są to wartości stałe, więc jeśli jest w instrukcji przełącznika, robi coś takiego:
Dlaczego miałbyś wiedzieć, co jest zadeklarowane jako stała?
źródło
Z guawą jest to jeszcze prostsze:
źródło
MyEnum.values()
zwraca tablicę instancji MyEnum iMyEnum.value().toString()
zwraca reprezentację ciągu tego obiektu tablicy (po prostu ciąg znaków, taki jak "[LMyEnum; @ 15b94ed3").name()
zamiast.toString()
(chyba że zastąpisz domyślną metodę toString). Zobacz to, aby uzyskać więcej informacji: Różnica między enum .name () i .toString ()Łączy to wszystkie podejścia z poprzednich metod i powinno mieć równoważną wydajność. Może być używany dla dowolnego wyliczenia, wbudowuje rozwiązanie „Edytuj” z @Richard H i używa wyjątków dla nieprawidłowych wartości, takich jak @bestsss. Jedyny kompromis polega na tym, że należy określić klasę, ale to zmienia to w dwuliniowiec.
}
źródło
źródło
rozwiązanie, aby sprawdzić, czy wartość jest obecna, a także uzyskać wartość wyliczenia w zamian:
źródło
Ten działa dla mnie:
źródło
Jeśli używasz Java 8 lub nowszej, możesz to zrobić:
źródło
źródło
Możesz zrobić to jako metodę zawierającą:
lub możesz po prostu użyć go ze swoim blokiem kodu:
źródło
możesz też użyć: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) zwraca opcjonalny
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
źródło
Po prostu napisałbym
Enum # equals działa tylko w przypadku porównania obiektów.
źródło
źródło
enum
są dość potężne w Javie. Możesz łatwo dodaćcontains
metodę do swojego wyliczenia (tak jak dodasz metodę do klasy):źródło
s.equals("b1") || s.equals("b2")
??s.equals("xx")
dla każdego wyliczenia, które dodasz później.