如何肯定數組在Java中是否包含特定值?

我有一個String[] ,其值以下所示: html

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

給定String s ,是否存在測試VALUES是否包含s的好方法? java


#1樓

Arrays.asList(yourArray).contains(yourValue)

警告:這不適用於圖元數組(請參見注釋)。 api


java-8開始,您如今能夠使用Streams。

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

要檢查intdoublelong數組是否包含值, LongStream分別使用IntStreamDoubleStreamLongStream數組

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);

#2樓

您能夠使用Arrays類對值執行二進制搜索。 若是未對數組進行排序,則必須使用同一類中的sort函數對數組進行排序,而後對其進行搜索。 oracle


#3樓

若是數組未排序,則必須遍歷全部內容並在每一個數組上調用equals。 函數

若是數組已排序,則能夠進行二進制搜索, Arrays類中有一個。 測試

通常來講,若是要進行大量成員資格檢查,則可能須要將全部內容存儲在Set中,而不是存儲在數組中。 spa


#4樓

只是爲了清除代碼。 咱們(已更正): 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類型,而且就個人口味而言,語法仍然過於冗長。)


#5樓

ObStupidAnswer(但我認爲這裏有一個教訓):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}
相關文章
相關標籤/搜索