我有一個String[]
,其值以下所示: html
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
給定String s
,是否存在測試VALUES
是否包含s
的好方法? java
Arrays.asList(yourArray).contains(yourValue)
警告:這不適用於圖元數組(請參見注釋)。 api
String[] values = {"AB","BC","CD","AE"}; boolean contains = Arrays.stream(values).anyMatch("s"::equals);
要檢查int
, double
或long
數組是否包含值, LongStream
分別使用IntStream
, DoubleStream
或LongStream
。 數組
int[] a = {1,2,3,4}; boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
您能夠使用Arrays類對值執行二進制搜索。 若是未對數組進行排序,則必須使用同一類中的sort函數對數組進行排序,而後對其進行搜索。 oracle
若是數組未排序,則必須遍歷全部內容並在每一個數組上調用equals。 函數
若是數組已排序,則能夠進行二進制搜索, Arrays類中有一個。 測試
通常來講,若是要進行大量成員資格檢查,則可能須要將全部內容存儲在Set中,而不是存儲在數組中。 spa
只是爲了清除代碼。 咱們(已更正): code
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
這是一個可變的靜態函數,FindBugs會告訴您這很頑皮。 它應該是私有的: htm
private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
(請注意,您實際上能夠刪除new String[];
位。)
所以,引用數組是很差的,特別是在這裏咱們須要一個集合:
private static final Set<String> VALUES = new HashSet<String>(Arrays.asList( new String[] {"AB","BC","CD","AE"} ));
(若是像我這樣的偏執狂人,若是將其包裝在Collections.unmodifiableSet
,則可能會更放心-甚至能夠將其公開。)
「給出String,是否有測試VALUES是否包含s的好方法?」
VALUES.contains(s)
O(1)。
更新:從Java SE 9開始,咱們有了Set.of
private static final Set<String> VALUES = Set.of( "AB","BC","CD","AE" );
正確的類型 , 不可變 , O(1)和簡潔 。 美麗。
(要進一步瞭解品牌,Collections API仍會缺乏不可變的collection類型,而且就個人口味而言,語法仍然過於冗長。)
ObStupidAnswer(但我認爲這裏有一個教訓):
enum Values { AB, BC, CD, AE } try { Values.valueOf(s); return true; } catch (IllegalArgumentException exc) { return false; }