查找数组是否包含另一个数组中的所有元素
我试图循环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[]
我想知道是否可以在不使用嵌套循环的情况下完成(如上所述)。 我知道我做错了什么,如果有人可以帮忙解决这个问题,那就太好了。 另外我不确定要在int[]
的java doc中查找哪个类。
您可以检查较大的数组outer
包含较小的数组中的每个元素,即inner
:
public static boolean linearIn(Integer[] outer, Integer[] inner) { return Arrays.asList(outer).containsAll(Arrays.asList(inner)); }
注意:此方法需要Integer
类型才能工作。 如果使用了原语,那么Arrays.asList
将返回一个包含int[]
类型的单个元素的List
。 在这种情况下,调用containsAll
不会检查数组的实际内容,而是比较原始int
数组的Object
引用。
如果您不想自己实现,可以使用java.util.Arrays
有两个选项:
-
Arrays.toList(array).contains(x)
,它正是你现在正在做的。 如果不保证对数组进行排序,那么最好的办法就是这样做。 - 如果您的数组已排序
Arrays.binarySearch(x,array)
提供Arrays.binarySearch(x,array)
。 它返回您要搜索的值的索引,或者返回负值。 它将比常规循环快得多。
如果您想使用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 innerAsList = arrayToList(inner); for (int i = 0; i < outer.length; i++) { if (!innerAsList.contains(outer[i])) { return false; } } return true; } private List arrayToList(int[] arr) { List result= new ArrayList (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)所以你没有获得任何性能。 您最了解您的模型,并且您可以编写更优化的代码。
int []是一个原始数组。 这意味着它没有附加任何特殊方法。 您必须手动编写自己的contains方法,您可以将数组和值传递给。
或者,您可以使用数组包装类,例如ArrayList,它具有.contains方法。
ArrayList inner = new ArrayList (); boolean containsOne = inner.contains(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; }