开发者问题收集

在 Java 中如何判断数组是否包含特定值?

2009-07-15
2745429

我有一个 String[] ,其值如下:

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

给定 String s ,有没有好的方法测试 VALUES 是否包含 s

3个回答
Arrays.asList(yourArray).contains(yourValue)

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


开始,您现在可以使用 Streams。

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

要检查 intdoublelong 数组是否包含值,请分别使用 IntStreamDoubleStreamLongStream

示例

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

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 可以预见地仍然缺少不可变集合类型,并且语法对我来说仍然过于冗长。)

Tom Hawtin - tackline
2009-07-15

您可以使用 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.
}
Intracer
2011-05-31