找到两个数组的并集

时间:2015-04-25 01:01:37

标签: java arrays set union

我正在尝试找到由用户输入创建的两个数组的联合。我一直在说:

线程“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;
}
}

4 个答案:

答案 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会更简单。