我正在尝试找到由用户输入创建的两个数组的联合。我一直在说:
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:4 在TwoSets.main(TwoSets.java:47)
import java.util.Scanner;
public class TwoSets
{
public static void main(String[] args)
{
int i, array, choice;
Scanner input = new Scanner(System.in);
System.out.print("How many numbers do you want in each set? ");
array = input.nextInt();
int set1[] = new int[array];
int set2[] = new int[array];
int set3[] = new int[array*2];
for(i=0;i<set1.length;i++)
{
System.out.print("Enter a number from the first set: ");
set1[i] = input.nextInt();
}
System.out.print("\n");
for(i=0;i<set2.length;i++)
{
System.out.print("Enter a number from the second set: ");
set2[i] = input.nextInt();
}
System.out.print("Enter 1 to find Union\n" + "Enter 2 to find Intersection\n" + "Enter 3 to find Difference\n");
choice = input.nextInt();
上面的代码是初始化和获取用户输入,这是正常的。以下代码无效。
if(choice == 1)
{
for(i=0;i<array;i++)
{
set3[i] = set1[i];
}
for(i=array;i<array*2;i++)
{
boolean check = Union(set2[i], set3);
if(check == false)
{
set3[i] = set2[i];
}
}
for(i=0;i<set3.length;i++)
{
System.out.print(set3[i]);
}
}
}
public static boolean Union(int number, int[] array)
{
for (int i : array )
{
if (i == number)
{
return true;
}
}
return false;
}
}
答案 0 :(得分:1)
当它尝试检查set2中的索引位置大于set2的长度时,此代码超出范围。
您需要注意的是,在迭代数组* 2时,您尝试将set2 [i]发送到union()。只要我大于或等于set2.length,这就不会起作用。这就是你的错误所在。
for(i=array;i<array*2;i++)
{
boolean check = Union(set2[i], set3);
if(check == false)
{
set3[i] = set2[i];
}
}
你只需要在这个方法中迭代set2的长度为1。
for(i=array;i<array;i++)
{
boolean check = Union(set2[i], set3);
if(check == false)
{
set3[i] = set2[i];
}
}
答案 1 :(得分:1)
set2具有数组长度,但是在:
for(i=array;i<array*2;i++)
{
boolean check = Union(set2[i], set3);
if(check == false)
{
set3[i] = set2[i];
}
}
你在循环中使用array * 2。 我认为这是一个错误。
答案 2 :(得分:1)
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class TwoSet {
public static void main(String[] args)
{
Set<Integer> set1 = new HashSet<>(Arrays.asList(new Integer [] {1,2,3,4}));
Set<Integer> set2 = new HashSet<>(Arrays.asList(new Integer [] {3,4,5,6}));
Set<Integer> set3 = new HashSet<>();
set3.addAll(set1);
set3.addAll(set2);
set3.forEach((i)->{System.out.println("set3: "+i);});
}
}
答案 3 :(得分:1)
您可以通过更改代码来消除异常,如下所示
for(i=0; i<array;i++)
{
boolean check = Union(set2[i], set3);
if(check == false)
{
set3[i+array] = set2[i];
}
}
然而,这将留下共同元素所在的空白。
你可能会更好地做像
这样的事情 j= array;
for(i=0; i<array;i++)
{
boolean check = Union(set2[i], set3);
if(check == false)
{
set3[j] = set2[i];
j++;
}
}
然后使用数组副本创建一个正确长度的新数组,并将填充的元素复制过来。
使用set3的列表将不再需要最后一步。
使用set3的set会更简单。