110

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

当前的:

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

也尝试过这个,尽管由于某种原因它总是返回 false。

public boolean contains(final int[] array, final int key) {
    return Arrays.asList(array).contains(key);
}

谁能帮帮我?

谢谢你。

4

15 回答 15

73

您可以简单地ArrayUtils.contains从 Apache Commons Lang 库中使用。

public boolean contains(final int[] array, final int key) {     
    return ArrayUtils.contains(array, key);
}
于 2012-08-18T16:50:57.943 回答
57

这是Java 8解决方案

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == key);
}
于 2015-12-31T05:52:06.293 回答
37

It's because Arrays.asList(array) returns List<int[]>. The array argument is treated as one value you want to wrap (you get a list of arrays of ints), not as vararg.

Note that it does work with object types (not primitives):

public boolean contains(final String[] array, final String key) {
    return Arrays.asList(array).contains(key);
}

or even:

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

But you cannot have List<int> and autoboxing is not working here.

于 2012-08-18T16:45:55.450 回答
21

Guava 为原始类型提供了额外的方法。其中有一个 contains 方法,它采用与您相同的参数。

public boolean contains(final int[] array, final int key) {
    return Ints.contains(array, key);
}

您不妨静态导入番石榴版本。

参见Guava Primitives Explained

于 2013-07-16T16:39:15.953 回答
19

另一种方式:

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

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

于 2012-08-18T16:50:00.330 回答
17

我知道现在已经很晚了,但请尝试Integer[]代替int[].

于 2014-12-16T13:13:39.623 回答
2

1.一次性使用

List<T> list=Arrays.asList(...)
list.contains(...)

2.如果您使用多次,请使用 HashSet 来考虑性能。

Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)
于 2014-08-22T08:54:51.983 回答
2

您可以使用以下 Java 8 代码将原始 int 数组转换为整数数组列表,

List<Integer> arrayElementsList = Arrays.stream(yourArray).boxed().collect(Collectors.toList());

然后使用contains()方法检查列表是否包含特定元素,

boolean containsElement = arrayElementsList.contains(key);
于 2019-05-26T13:15:34.673 回答
1

尝试这个:

public static void arrayContains(){
    int myArray[]={2,2,5,4,8};

    int length=myArray.length;

    int toFind = 5;
    boolean found = false;

    for(int i = 0; i < length; i++) {
        if(myArray[i]==toFind) {
            found=true;
        }
    }

    System.out.println(myArray.length);
    System.out.println(found); 
}
于 2018-12-18T13:33:22.963 回答
0

您可以使用java.util.Arrays类通过以下方法转换对象T[?]中的数组:List<T>contains

Arrays.asList(int[] array).contains(int key);
于 2014-11-20T04:14:44.387 回答
0

这在java 8中有效

public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}
于 2016-10-29T19:44:17.767 回答
0
private static void solutions() {
    int[] A = { 1, 5, 10, 20, 40, 80 };
    int[] B = { 6, 7, 20, 80, 100 };
    int[] C = { 3, 4, 15, 20, 30, 70, 80, 120 };

    List<Integer> aList = Arrays.stream(A).boxed().collect(Collectors.toList());

    List<Integer> cList = Arrays.stream(C).boxed().collect(Collectors.toList());
    String s = "";
    for (Integer a : C) {
        if (aList.contains(a) && cList.contains(a)) {
            s = s.concat(String.valueOf(a)).concat("->");
        }
    }
}
于 2021-06-16T14:48:08.610 回答
0

Java 9+

public boolean contains(final int[] array, final int key) {
    return List.of(array).contains(key);
}
于 2021-11-19T01:48:25.593 回答
-1

.contains根据您的 int 数组的大小,如果您使用集合而不是一次遍历数组一个元素,您将获得更好的性能:

import static org.junit.Assert.assertTrue;
import java.util.HashSet;

import org.junit.Before;
import org.junit.Test;

public class IntLookupTest {

int numberOfInts = 500000;
int toFind = 200000;
int[] array;

HashSet<Integer> intSet;

@Before
public void initializeArrayAndSet() {
    array = new int[numberOfInts];
    intSet = new HashSet<Integer>();
    for(int i = 0; i < numberOfInts; i++) {
        array[i] = i;
        intSet.add(i);
    }
}

@Test
public void lookupUsingCollections() {
    assertTrue(intSet.contains(toFind));
}

@Test
public void iterateArray() {
    assertTrue(contains(array, toFind));

}

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}
}
于 2012-08-18T17:18:22.987 回答
-6

尝试Integer.parseInt()这样做......

public boolean chkInt(final int[] array){
    int key = false;

    for (Integer i : array){


          try{

                   Integer.parseInt(i);
                   key = true;
                   return key;

             }catch(NumberFormatException ex){

                   key = false;

                   return key;

              }


     }
}
于 2012-08-18T17:15:42.123 回答