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

时间:2013-05-13 14:37:01

标签: java arrays

我试图遍历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[]找到什么类。

5 个答案:

答案 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两个选项:

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