我试图遍历2个数组,外部数组比另一个数组长。它将遍历第一个,如果第二个数组不包含该int,则返回false。但我无法弄清楚如何解决这个问题。这就是我到目前为止所做的:
public boolean linearIn(int[] outer, int[] inner) {
for (int i = 0; i < outer.length; i++) {
if (!inner.contains(outer[i])) {
return false;
}
}
return true;
}
运行时出现此错误:
Cannot invoke contains(int) on the array type int[]
我想知道是否可以在不使用嵌套循环的情况下完成(如上所述)。我知道我做错了什么,如果有人可以帮忙解决这个问题,那就太好了。另外,我不确定要在{docer}中为int[]
找到什么类。
答案 0 :(得分:31)
您可以检查较大的数组outer
是否包含较小的数组中的每个元素,即inner
:
public static boolean linearIn(Integer[] outer, Integer[] inner) {
return Arrays.asList(outer).containsAll(Arrays.asList(inner));
}
注意:此方法需要Integer
类型才能工作。如果使用了基元,则Arrays.asList
将返回包含List
类型的单个元素的int[]
。在这种情况下,调用containsAll
不会检查数组的实际内容,而是比较原始int
数组Object
引用。
答案 1 :(得分:2)
如果您想使用contains
,那么您需要一个ArrayList。请参阅:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#contains(java.lang.Object)
否则,您需要两个循环。
有这样的解决方法:
public boolean linearIn(int[] outer, int[] inner) {
List<Integer> innerAsList = arrayToList(inner);
for (int i = 0; i < outer.length; i++) {
if (!innerAsList.contains(outer[i])) {
return false;
}
}
return true;
}
private List<Integer> arrayToList(int[] arr) {
List<Integer> result= new ArrayList<Integer>(arr.length);
for (int i : arr) {
result.add(i);
}
return result;
}
但是不要以为循环没有发生,只是因为你没有看到它。如果检查ArrayList的实现,您会看到有一个for循环: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.indexOf(java.lang.Object) 所以你没有获得任何表现。您最了解您的模型,并且您可能能够编写更优化的代码。
答案 2 :(得分:2)
如果您不想自己实施,可以使用java.util.Arrays
两个选项:
Arrays.toList(array).contains(x)
你现在正在做的事情。如果不保证对数组进行排序,那么最好这样做。Arrays.binarySearch(x,array)
。它返回您要搜索的值的索引,或者返回负值。它将比常规循环快得多。答案 3 :(得分:0)
int []是一个原始数组。这意味着它没有附加任何特殊方法。您必须手动编写自己的contains方法,您可以将数组和值传递给。
或者你可以使用数组包装类,例如ArrayList,它有一个.contains方法。
ArrayList<Integer> inner = new ArrayList<Integer>();
boolean containsOne = inner.contains(1);
答案 4 :(得分:-1)
包含为ArrayList保留的方法 试试这个:
public boolean linearIn(int[] outer, int[] inner) {
for (int i = 0; i < outer.length; i++) {
for (int j = 0; j < inner.length; j++) {
if (outer[i] == inner[j])
return false;
}
}
return true;
}