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

java arrays


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

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

给定 String s ,是否存在测试 VALUES 是否包含 s 的好方法?




Answer 1 camickr


Arrays.asList(yourArray).contains(yourValue)

警告:这对基元数组不起作用(请参阅注释)。


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

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

要检查 intdoublelong 数组是否包含值, LongStream 分别使用 IntStreamDoubleStream 或LongStream。

Example

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



Answer 2 Tom Hawtin - tackline


Java SE 9的简明更新

引用数组不好。对于这种情况,我们要紧紧追赶。由于Java SE 9,我们有 Set.of

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

“给出String,是否有测试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 中,则可能会更放心-甚至可以将其公开。)

(*在品牌上要多说一点,按我的喜好,collection API仍会缺少不可变的collection类型,并且语法仍然太冗长。)




Answer 3 Intracer


您可以使用来自Apache Commons Lang的 ArrayUtils.contains

public static boolean contains(Object[] array, Object objectToFind)

请注意,如果传递的数组为 null ,则此方法返回 false

还有一些方法可以用于各种原始数组。

Example:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}



Answer 4 icza


只是简单的用手实现。

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Improvement:

v != null 条件是在方法内不变。在方法调用期间,它始终求值为相同的布尔值。因此,如果输入 array 很大,则仅一次评估此条件会更有效率,并且我们可以根据结果在 for 循环内使用简化/更快的条件。改进的 contains() 方法:

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}



Answer 5 Sireesh Yarlagadda


检查一个数组是否包含一个值的四种不同方法

  1. 使用 List

    public static boolean useList(String[] arr, String targetValue) {
        return Arrays.asList(arr).contains(targetValue);
    }
  2. 使用 Set

    public static boolean useSet(String[] arr, String targetValue) {
        Set<String> set = new HashSet<String>(Arrays.asList(arr));
        return set.contains(targetValue);
    }
  3. 使用一个简单的循环。

    public static boolean useLoop(String[] arr, String targetValue) {
        for (String s: arr) {
            if (s.equals(targetValue))
                return true;
        }
        return false;
    }
  4. 使用 Arrays.binarySearch()

    下面的代码是错误的,此处出于完整性目的列出了该代码。 binarySearch() 只能在排序数组上使用。您会发现下面的结果很奇怪。这是对数组排序时的最佳选择。

    public static boolean binarySearch(String[] arr, String targetValue) {  
        return Arrays.binarySearch(arr, targetValue) >= 0;
    }

快速实例。

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false