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

时间:2012-08-18 16:41:49

标签: 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;
}

也试过这个,虽然它总是因某种原因而返回false。

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

有人可以帮帮我吗?

谢谢。

15 个答案:

答案 0 :(得分:55)

您只需使用Apache Commons Lang library中的ArrayUtils.contains

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

答案 1 :(得分:30)

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

请注意 使用对象类型(而不是基元):

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

甚至:

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

但你不能拥有List<int>并且自动装箱在这里不起作用。

答案 2 :(得分:20)

这是Java 8解决方案

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

答案 3 :(得分:17)

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

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

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

请参阅Guava Primitives Explained

答案 4 :(得分:15)

另一种方式:

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)

答案 5 :(得分:14)

我知道这已经太晚了,但请尝试Integer[]而不是int[]

答案 6 :(得分:1)

1.one-off使用

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

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

Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)

答案 7 :(得分:0)

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

Arrays.asList(int[] array).contains(int key);

答案 8 :(得分:0)

这适用于java 8

Ratings

答案 9 :(得分:0)

尝试一下:

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); 
}

答案 10 :(得分:0)

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

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

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

boolean containsElement = arrayElementsList.contains(key);

答案 11 :(得分: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("->");
        }
    }
}

答案 12 :(得分:-1)

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

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;
}
}

答案 13 :(得分:-1)

解决方案#1

由于原始问题只需要一个简化的解决方案(而不是更快的解决方案),所以这是一个单行解决方案:

public boolean contains(int[] array, int key) {
    return Arrays.toString(array).matches(".*[\\[ ]" + key + "[\\],].*");
}

说明: Arrays.toString()的Javadoc表示结果用方括号括起来,相邻的元素用字符&#34;,&#34;分隔。 (逗号后跟空格)。所以我们可以指望这一点。首先我们将array转换为字符串,然后检查此字符串中是否包含key。当然我们不能接受&#34;子数字&#34; (例如&#34; 1234&#34;包含&#34; 23&#34;),所以我们必须寻找key前面有一个开括号或空格的模式,然后关闭括号或逗号。

注意:使用的正则表达式模式也正确处理负数(其字符串表示以减号开头)。

解决方案#2

此解决方案已发布,但包含错误,因此我发布了正确的解决方案:

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

此解决方案也有副作用:它修改array(对其进行排序)。

答案 14 :(得分:-4)

尝试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;

              }


     }
}