Java,简体检查如果int数组包含int

基本上我的队友一直在说我可以通过使用不同的方法来检查一个int数组是否包含一个int来缩短我的代码,尽pipe他不会告诉我它是什么: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); } 

任何人都可以帮我吗?

谢谢。

你可以简单地使用ArrayUtils.contains

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

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

请注意,它可以处理对象types(不是原语):

 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>和autoboxing在这里不工作。

番石榴提供了原始types的其他方法。 其中一个包含与你的论点相同的方法。

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

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

见番石榴原始解释

不同的方式:

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

这修改了传入的数组。 你可以select复制数组,并在原始数组上工作,即int[] sorted = array.clone();
但这只是短码的一个例子。 运行时是O(NlogN)而你的方式是O(N)

这是Java 8的解决scheme

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

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

一次性使用

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

如果您使用多次,则使用HashSet来考虑性能。

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

如果数组是int,double或long,我们可以分别使用这些IntStream,DoubleStream或LongStream

 int[] values = { 1, 33, 55, 66 }; int testValue = 33; boolean contains = IntStream.of(values).anyMatch(x -> x == testValue); 

参考 – 检查数组中的值

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

解决scheme#1

由于原始问题只需要一个简化的解决scheme(而不是一个更快的解决scheme),下面是一个单线解决scheme:

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

说明: Arrays.toString() Javadoc声明结果用方括号括起来,相邻的元素用“,”(逗号后跟一个空格)分隔。 所以我们可以指望这一点。 首先我们将array转换为一个string,然后检查这个string是否包含key 。 当然,我们不能接受“子数字”(例如“1234”包含“23”),所以我们必须寻找key前面有一个左括号或空格,然后是右括号或逗号。

注意:使用的正则expression式模式也可以正确处理负数(其string表示以负号开始)。

解决scheme#2

此解决scheme已发布但包含错误,所以我张贴正确的解决scheme:

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

此解决scheme也有一个副作用:它修改array (sorting)。

尝试:Arrays.asList(int []数组).contains(int key);

这在java 8中工作

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

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