查找数组是否包含另一个数组中的所有元素

我试图循环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; }