【问题标题】:Finding difference between two integer arrays查找两个整数数组之间的差异
【发布时间】:2018-01-07 18:18:30
【问题描述】:

我正在编写一个函数,它返回两个整数数组之间的差异。我假设输入数组中的所有元素都是唯一的,并且输入数组也没有排序。例如:

输入:
arr1 = [1,2,3,5,4]
arr2 = [1,2,3]

预期输出:[4,5]

我的输出:[1,2,3,4,5](当第一个数组大于第二个时)

当我使第二个数组大于第一个时,我得到ArrayIndexOutOfBoundsException

public class Test{

     public static void main(String args[])
    {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter length of first array");
        int ml = sc.nextInt();
        System.out.println("Enter length of second array");
        int nl = sc.nextInt();
        int m[] = new int[ml];
        int n[] = new int[nl];
        System.out.println("Enter elements of first array");
        for(int i=0;i<ml;i++)
        {
            m[i] = sc.nextInt();
        }

        System.out.println("Enter elements of second array");
        for(int j=0;j<nl;j++)
        {
            m[j] = sc.nextInt();
        }
        ArrayList<Integer> arr1 = new ArrayList<Integer>();
        for(int i: m){ arr1.add(i);}
        ArrayList<Integer> arr2 = new ArrayList<Integer>();
        for(int j: n){ arr2.add(j);}
        if(ml>nl)
        {
            arr1.removeAll(arr2);
            System.out.println(arr1);
        }
        else
        {
            arr2.removeAll(arr1);
            System.out.println(arr2);
        }
    }
}

【问题讨论】:

  • 我强烈建议您使用调试器逐步完成此操作。您将能够确切地看到发生了什么。
  • 使用 try catch 块进行适当的异常处理。

标签: java arraylist


【解决方案1】:

如果不是让你练习数组/迭代的作业,你可以考虑使用Set 来实现更简单的逻辑:

// pseudo-code
Set<Integer> set1 = new HashSet<>(array1);
Set<Integer> set2 = new HashSet<>(array2);

// Using Guava
Set<Integer> diff = Sets.symmetricDifference(set1, set2);

// Java only
Set<Integer> diff1 = new HashSet<>(set1);
diff1.removeAll(set2);  // diff1 contains entries in array1 but not 2
Set<Integer> diff2 = new HashSet<>(set2);
diff2.removeAll(set1);  // diff2 contains entries in array2 but not 1

Set<Integer> diff = new HashSet<>(set1);
diff.addAll(set2);


// Java only, using stream
return Stream.concat(set1.stream(), set2.stream())
             .filter(i -> ! (set1.contains(i) && set2.contains(i)))
             .collect(Collectors.toSet());

【讨论】:

    【解决方案2】:

    您可以检查第二个元素是否存在,如果不可以添加到输出数组,如下所示:

        int[] array1 = new int[] { 1, 2, 3, 4, 5 };
        int[] array2 = new int[] { 1, 2, 3 };
        List<Integer> output = new ArrayList<>();
        for (int i = 0; i < array1.length; i++) {
            boolean flag = false;
            for (int j = 0; j < array2.length; j++) {
                if (array1[i] == array2[j]) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                output.add(array1[i]);
            }
        }
    
        System.out.println(output);
    

    【讨论】:

      【解决方案3】:

      在第二次迭代中,您应该使用 n[j] = ... 而不是 m[j] = ... 您应该使用更具描述性的变量名称来防止发生类似的事情。

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        相关资源
        最近更新 更多