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