【问题标题】:Finding if an array contains all elements in another array查找一个数组是否包含另一个数组中的所有元素
【发布时间】:2021-12-30 20:18:29
【问题描述】:

我正在尝试遍历 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 文档中查找什么类。

【问题讨论】:

  • 您正在尝试确定数组是否有任何共同的元素,对吗?
  • 嗯,是的,我正在尝试确定第一个数组是否包含第二个数组的所有元素。
  • 您唯一能真正期待的是隐藏嵌套循环(或两个循环)。在内部,它总是需要遍历数组...

标签: java arrays


【解决方案1】:

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

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

ArrayList<Integer> inner = new ArrayList<Integer>();
boolean containsOne = inner.contains(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) 所以你没有获得任何表现。您最了解您的模型,并且您可能能够编写更优化的代码。

    【讨论】:

    • Arrays.asList(inner).containsAll(Arrays.asList(outer))怎么样
    • Arrays.asList(inner) 返回一个包含一个 int[] 项的列表。它可能没有达到 OP 的预期。
    【解决方案3】:

    contain 方法是为 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;
    }
    

    【讨论】:

    • 不应该是 if (outer[i] != inner[j]) 还是我错过了什么?
    【解决方案4】:

    您可以检查较大的数组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 引用。

    【讨论】:

      【解决方案5】:

      如果你不想自己实现它,你有两个选择使用java.util.Arrays

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-05
        • 2021-06-04
        • 2016-11-16
        • 1970-01-01
        相关资源
        最近更新 更多