在 Java 中如何判断数组是否包含特定值?
我有一个
String[]
,其值如下:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
给定
String s
,有没有好的方法测试
VALUES
是否包含
s
?
Arrays.asList(yourArray).contains(yourValue)
警告:这不适用于原始数组(请参阅注释)。
从 java-8 开始,您现在可以使用 Streams。
String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);
要检查
int
、
double
或
long
数组是否包含值,请分别使用
IntStream
、
DoubleStream
或
LongStream
。
示例
int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
Java SE 9 的简洁更新
引用数组不好。在这种情况下,我们追求一个集合。自 Java SE 9 以来,我们有
Set.of
。
private static final Set<String> VALUES = Set.of(
"AB","BC","CD","AE"
);
“给定 String 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 可以预见地仍然缺少不可变集合类型,并且语法对我来说仍然过于冗长。)
您可以使用 Apache Commons Lang ArrayUtils.contains 。>
public static boolean contains(Object[] array, Object objectToFind)
请注意,如果传递的数组为
null
,则此方法返回
false
。
对于所有类型的原始数组,也有可用的方法种类。
示例:
String[] fieldsToInclude = { "id", "name", "location" };
if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
// Do some stuff.
}