Java,Simplified检查int数组是否包含int

Cal*_*leb 82 java arrays int contains

基本上我的伙伴一直在说我可以通过使用一种不同的方式检查一个int数组是否包含int来缩短我的代码,尽管他不会告诉我它是什么:P.

当前:

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

也试过这个,虽然它总是由于某种原因返回false.

public boolean contains(final int[] array, final int key) {
    return Arrays.asList(array).contains(key);
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我吗?

谢谢.

Rei*_*eus 56

你可以简单地使用ArrayUtils.containsApache Commons Lang library.

public boolean contains(final int[] array, final int key) {     
    return ArrayUtils.contains(array, key);
}
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,`ArrayUtils.contains()`是`Apache Commons Lang`库的一部分.即使这是一个很棒的lib,添加外部依赖项只是为了检查数组是否包含一个元素可能仍然不是一个好主意:D (16认同)
  • 没有理由:) (2认同)
  • ArrayUtils 已成为过去。Java 8+ 和 Guava 有非常惊人的好东西!! (2认同)

Tom*_*icz 33

这是因为Arrays.asList(array)回归List<int[]>.array参数被视为要包装的一个值(获取整数数组的列表),而不是vararg.

请注意,它确实适用于对象类型(而不是基元):

public boolean contains(final String[] array, final String key) {
    return Arrays.asList(array).contains(key);
}
Run Code Online (Sandbox Code Playgroud)

甚至:

public <T>  boolean contains(final T[] array, final T key) {
    return Arrays.asList(array).contains(key);
}
Run Code Online (Sandbox Code Playgroud)

但你不能拥有List<int>和autoboxing在这里工作.


Tri*_*ore 24

这是Java 8解决方案

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == key);
}
Run Code Online (Sandbox Code Playgroud)


小智 18

Guava为原始类型提供了额外的方法.其中包含一个包含与你相同的参数的方法.

public boolean contains(final int[] array, final int key) {
    return Ints.contains(array, key);
}
Run Code Online (Sandbox Code Playgroud)

您也可以静态导入番石榴版本.

参见番石榴原始解释


Cra*_*lus 15

另一种方式:

public boolean contains(final int[] array, final int key) {  
     Arrays.sort(array);  
     return Arrays.binarySearch(array, key) >= 0;  
}  
Run Code Online (Sandbox Code Playgroud)

这会修改传入的数组.你可以选择复制数组并处理原始数组,int[] sorted = array.clone();
但这只是一个简短代码的例子.运行时就是O(NlogN)你的方式O(N)

  • 如果一个`contains`方法修改了我的数组,我想我会感到惊讶. (28认同)
  • 来自binarySearch()的javadoc:"当且仅当找到密钥时,返回值将> = 0." 所以应该返回Arrays.binarySearch(array,key)> = 0! (5认同)

小智 15

我知道这是最晚的,但尝试Integer[]而不是int[].