如何肯定数组在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;
}
相关文章
相关标签/搜索