2

思路是计算两个集合的并集,在程序开始时,会要求用户输入所需集合的长度,然后提示他分配集合中的元素,最终的想法是计算并集。我已经到了最后,在编译我的程序后,只打印了第一组的元素,我真的不知道为什么。

所以我的问题是如何按照我开始的想法计算集合并集。

我的输出:

所需的数组长度:3 3 第一个集合元素:1 2 3 第二个集合元素:4 5 6 我们集合的 UNION:1.002.003

public class Union{

public static void main(String[] args) {
    System.out.println("Desired array lengths: ");
    Scanner scan = new Scanner(System.in);

    //Infinite loop for reading input,if negative number entered break the loop!

    while (true) {
        int n1 = scan.nextInt();
        int n2 = scan.nextInt();
        if (n1 < 0 || n2 < 0)
            break;

        // Assigning elements to the first set.
        double[] s1 = new double[n1];
        System.out.println("First set elements: ");
        //We enter elements as long as the number of the elements added is less than the length of an array we assigned.
        for (int i = 0; i < n1; s1[i++] = scan.nextInt());

            if (n1 == 0)
            System.out.println();//If we do not enter any element go to new line

        //Assigning elements to the second set.
        double[] s2 = new double[n2];
        System.out.println("Second set elements: ");
        for (int i = 0; i < n2; s2[i++] = scan.nextInt());

        if (n2 == 0)
            System.out.println();//Same as before.

        // Calculating union

        double[] s3 = new double[n1 + n2];//We reserve memory space for the s3 array with the size equal to both n1 and n2 arrays.
        int n3 = 0; // Variable used to save number of elements,after reaching the end of the loop n3 WILL HAVE THE SIZE OF N1.
        while (n3 < n1) 
            s3[n3] = s1[n3++];
        for (int j = 0; j < n2; j++) {  //HERE WE ARE CHECKING IF THE ELEMENTS FROM N2 SET ARE PRESENT IN THE N1 
            int i = 0;
            while (i < n1 && s2[j] == s1[i])
                i++;
            if (i == n1)
                s3[n3++] = s2[j];
        }

        double[] pom = new double[n3];
        for (int i = 0; i < n3; pom[i] = s3[i++]);

        s3 = pom;
        pom = null;

        System.out.println("UNION of our sets: ");
        for (int i = 0; i < n3; System.out.printf("%.2f", s3[i++]))
            ;
        System.out.print("\n\n");
    }

}
4

3 回答 3

1

错误在于您要检查哪些元素的代码set s2,您需要放入set s3

基本上你需要检查一个元素set s2是否存在于set s1.

所以更改以下代码:

for (int j = 0; j < n2; j++) {  
       int i = 0;
       while (i < n1 && s2[j] == s1[i])
         i++;
       if (i == n1)
         s3[n3++] = s2[j];
}

到这段代码:

for (int j = 0; j < n2; j++) {  
       int i = 0;
       while (i < n1 && s2[j] != s1[i])
         i++;
       if (i == n1)
         s3[n3++] = s2[j];
}

只有当 , 中没有任何元素与 element 匹配并且这是我们在2 个集合中想要的元素时,循环while (i < n1 && s2[j] != s1[i])才会以 终止。i = n1set s1s2[j]UNION

于 2017-04-15T18:34:43.057 回答
1

您可以使用Java 集合框架吗?Set 接口可以很容易地做到这一点。

Set<Double> union = new HashSet<>();
for (double e : s1)
    union.add(e);
for (double e : s2)
    union.add(e);
System.out.println(union);

如果您不能使用集合框架并且必须滚动自己的框架,那么您可以考虑滚动自己的二叉树或堆。

于 2017-04-15T18:36:23.867 回答
1

这是因为以下块:

while (i < n1 && s2[j] == s1[i])
    i++;
if (i == n1)

它试图比较具有相似索引的两个数组的元素,例如,如果s1和的第一个元素s2不相等,控制将跳出while循环,因此i永远不会n1,导致js2 索引处的元素被跳过。

就联合的计算而言,您可以使用SetJava 轻松完成,例如:

Set<Double> elements = new LinkedHashSet<>();
for(double number : s1){
    elements.add(number);
}
for(double number : s2){
    elements.add(number);
}
double[] union = new double[elements.size()];
int i = 0;
Iterator<Double> iterator = elements.iterator();
while(iterator.hasNext()){
    union[i++] = iterator.next();
}
于 2017-04-15T18:39:41.697 回答