我正在编写一个返回两个整数数组之间差异的函数。我假设输入数组中的所有元素都是唯一的,并且输入数组也没有排序。例如:
输入:
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);
}
}
}
答案 0 :(得分:2)
在第二次迭代中,您应该使用n[j] = ...
而不是m[j] = ...
你应该使用更多的描述性变量名来防止事情发生。
答案 1 :(得分:0)
如果不是让你练习数组/迭代的作业,你可以考虑使用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 :(得分:0)
您可以检查第二个元素是否存在,否则可以添加到输出数组,如下所示:
users