如何确定数组是否包含 Java 中的特定值?

2022-08-31 01:23:11

我有一个这样的值:String[]

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

给定,有没有一个好方法来测试是否包含?String sVALUESs


答案 1
Arrays.asList(yourArray).contains(yourValue)

警告:这不适用于基元数组(请参阅注释)。


,您现在可以使用Streams。

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

要检查 的数组 或 是否包含值,请分别使用 或。intdoublelongIntStreamDoubleStreamLongStream

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

答案 2

Java SE 9 的简明更新

引用数组不正确。对于这种情况,我们追求一个集合。自 Java SE 9 以来,我们有 .Set.of

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

“给定字符串 s,有没有一种好方法来测试 VALUES 是否包含 s?”

VALUES.contains(s)

O(1).

正确的类型不可变,O(1)简洁。美丽。

原始答案详细信息

只是为了从一开始就清除代码。我们已经(已更正):

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

这是一个可变的静态,FindBugs会告诉你这是非常顽皮的。不要修改静态,也不允许其他代码这样做。在绝对值下,该字段应为私有:

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

(*为了在品牌上做得更多一点,可以预见的是,集合API仍然缺少不可变的集合类型,语法仍然太冗长,不符合我的口味。