【问题标题】:How to check if an ArrayList is contained inside another ArrayList, with both Lists being of different size [duplicate]如何检查一个ArrayList是否包含在另一个ArrayList中,两个List的大小不同[重复]
【发布时间】:2018-03-26 11:02:33
【问题描述】:

我为一个程序编写了代码,该程序接受两个列表,如果第二个数组的所有元素也出现在第一个数组中,则返回 true。但是,此代码仅适用于大小相等的两个数组(例如 {1, 2, 3} 和 {3, 2, 1} 返回 true),但如果第一个数组大于第二个数组,我会收到 rangeCheck 异常(公平地说,我完全期待这一点)。

import java.util.*;

public class Ex8 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("How many numbers do you wish to enter into the 
array?");
        int thisMany = scanner.nextInt();
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        System.out.println("Please enter some numbers, separated by 
spaces");
        for(int i = 0; i<thisMany; i++) {
            int x = scanner.nextInt();
            numbers.add(x);
        }
        Scanner sc = new Scanner(System.in);
        System.out.println("How many numbers do you wish to enter into the 
second array?");
        int nowThisMany = sc.nextInt();
        ArrayList<Integer> numbers2 = new ArrayList<Integer>();
        System.out.println("Enter some numbers, separated by spaces");
        for(int j = 0; j<nowThisMany; j++) {
            int y = sc.nextInt();
            numbers2.add(y);
        }
        System.out.println(Arrays.toString(numbers.toArray()));
        System.out.println(Arrays.toString(numbers2.toArray()));
        isContained(numbers, numbers2);
        System.out.println(isContained(numbers, numbers2));
    }

    public static boolean isContained(ArrayList<Integer> numbers, 
ArrayList<Integer> numbers2) {
        boolean equalsTest = false;
        for(int i = 0; i<numbers.size(); i++) { //This gives exception if
//both arrays aren't the same size
            if(numbers.get(i) == numbers2.get(i)) {
                equalsTest = true;
            }
        }
        return equalsTest;
    }
}

谁能向我解释如何检查第二个数组和第一个数组而不会遇到异常?谢谢

【问题讨论】:

  • boolean Collection.containsAll(Collection&lt;?&gt; c);

标签: java arraylist


【解决方案1】:

如果 {1, 2, 3} 和 {3, 2, 1} 使用您当前的代码返回 true,我会感到惊讶。由于您要检查 numbers2 中的每个项目是否都在 numbers 中,请遍历 numbers2 并检查每个项目是否在 numbers 中。

public static boolean isContained(ArrayList<Integer> numbers, 
        ArrayList<Integer> numbers2) {
    outer:
    for(int i = 0; i<numbers2.size(); i++) {
        for(int j = 0; j<numbers.size(); j++){
            if(numbers2.get(i) == numbers.get(j)){
                continue outer;
        return false;
    return true;

【讨论】:

    【解决方案2】:

    您得到异常是因为您没有检查哪个数组更大。你可以像这样添加一个 if 语句:

    public static boolean isContained(ArrayList<Integer> numbers, 
    ArrayList<Integer> numbers2) {
        boolean equalsTest = false;
        if(numbers.size() > numbers2.size()){
            for(int i = 0; i<numbers.size(); i++) {
                if(numbers.get(i) == numbers2.get(i)) {
                    public static boolean isContained(ArrayList<Integer> numbers, ArrayList<Integer> numbers2) {
                        boolean equalsTest = false;
                        for(int i = 0; i<numbers.size(); i++) { 
                            if(numbers.get(i) == numbers2.get(i)) {
                            equalsTest = true;
                            }
                        }
                        return equalsTest;
                     }     
                     equalsTest = true;
                 } 
            }
            return equalsTest;
        }
        else ;// Here add a logic of checking if the second list is larger
    }
    

    【讨论】:

      【解决方案3】:

      与寻求帮助的常见情况一样,我发现在发布问题后不久就会找到解决方案。

      无论如何,我设法通过使用int j 遍历第二个列表的嵌套for 循环解决了这个问题。这是我在isContained 方法中使用的代码:

      public static boolean isContained(ArrayList<Integer> numbers, 
      ArrayList<Integer> numbers2) {
              boolean equalsTest = false;
              for(int i = 0; i<=numbers.size()-1; i++) {
                  for(int j = 0; j<=numbers2.size()-1; j++) { //This second for loop goes through the elements of the second List separately without causing an exceptoion
                      if(numbers.get(i) == numbers2.get(j)) {
                          equalsTest = true;
                          break;
                      }
                  }
              }
              return equalsTest;
      }
      

      【讨论】:

        【解决方案4】:

        您的代码问题出现在以下行:

         if(numbers.get(i) == numbers2.get(i)) {
        

        考虑到当大小不相等时你不能这样做,因为当你的第一个数组包含 5 个元素而第二个数组包含 2 个元素时,你会尝试比较

         if(numbers.get(3) == numbers2.get(3)) {
        

        其中 numbers2 没有那个元素,这就是你得到错误的原因, 如果你想检查一个数组是否包含另一个数组,简单的方法是使用

        boolean Collection.containsAll(Collection<?> c);
        

        但如果您尝试编写自己的代码,请确保您正在考虑以下方面,并更新您的代码:

        • 考虑数组的大小,您应该搜索较小的数组 在大里面!!
        • 对于小数组的每个元素,检查大数组是否包含它,如果找到大数组的元素 数组去下一个(小数组的下一个元素),
        • 如果在大数组中找不到小数组的元素,则结果为 false,因此您可以返回 false 并忽略搜索其他人
        • 如果小数组的所有元素都建立在大数组中 答案是真的,

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-08
          • 1970-01-01
          相关资源
          最近更新 更多