如何检查ArrayList是否包含在另一个ArrayList中,两个Lists的大小不同

时间:2017-10-14 12:38:34

标签: java arraylist

我编写了一个带有两个Lists的程序的代码,如果第二个数组的所有元素也出现在第一个数组中,则返回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;
    }
}

任何人都可以向我解释如何在没有遇到异常的情况下检查第一个数组的第二个数组吗?感谢

4 个答案:

答案 0 :(得分:0)

如果{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;

答案 1 :(得分:0)

你得到了例外,因为你没有检查哪个数组更大。您可以添加如下语句:

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
}

答案 2 :(得分:0)

正如寻求帮助的情况一样,我发现在发布问题后,解决方案会在一段时间后出现。

无论如何,我设法通过使用int j的嵌套for循环来解决问题,以通过第二个List。这是我在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;
}

答案 3 :(得分:0)

您的代码出现问题:

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

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

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

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

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

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

  • 考虑数组的大小,你应该搜索更小的数组 里面大的!!
  • 对于小尺寸数组的每个元素,检查大数组是否包含它,如果找到大的元素 array转到下一个(小数组的下一个元素),
  • 如果在大数组中找不到小数组的元素,结果是 false,所以你可以返回false并忽略搜索其他人
  • 如果小数组的所有元素都是以大数组形式建立的 答案是肯定的,