9

我正在尝试遍历 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[]

我想知道是否可以在不使用嵌套循环的情况下完成(如上)。我知道我做错了什么,如果有人能在这件事上提供帮助,那就太好了。此外,我不确定在 java 文档中为int[].

4

5 回答 5

45

您可以检查较大的数组是否outer包含较小数组中的每个元素,即inner

public static boolean linearIn(Integer[] outer, Integer[] inner) {

   return Arrays.asList(outer).containsAll(Arrays.asList(inner));
}

注意:Integer这种方法需要类型才能工作。如果使用原语, Arrays.asList则将返回List包含单个元素类型的 a int[]。在这种情况下,调用containsAll不会检查数组的实际内容,而是比较原始int数组Object引用。

于 2013-05-13T14:49:06.740 回答
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) 所以你没有获得任何性能。您最了解您的模型,并且您可能能够编写更优化的代码。

于 2013-05-13T14:41:12.290 回答
2

java.util.Arrays如果您不想自己实现它,您有两种选择:

于 2013-05-13T14:55:41.920 回答
0

int[] 是一个原始数组。这意味着它没有附加任何特殊方法。您必须手动编写自己的 contains 方法,您可以将数组和值传递给该方法。

或者,您可以使用具有 .contains 方法的数组包装类,例如 ArrayList。

ArrayList<Integer> inner = new ArrayList<Integer>();
boolean containsOne = inner.contains(1);
于 2013-05-13T14:41:08.133 回答
-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;
}
于 2013-05-13T14:45:20.027 回答