从两个列表中删除重复的公共输出

4

我有两个数组。我希望输出的是两个列表之间共同的数字,但是使用以下代码会输出重复的共同数字。

 double[] arr1 = {100.00, 100.00, 17246.40, 2568.00, 0.20, 9845.00, 5768.18, 0.20, 30.00,
      63.68, 83.56, 444.39, 144.20, 2889.00};

 double[] arr2 = {2000.90, 508.07, 100.00, 17246.40, 5899.38, 17246.40, 17246.40, 2568.00,
      83.56, 144.20, 2889.00, 3000.00, 2568.00, 60.00, 3135.00, 28329.91, 3135.00, 9845.00};

 for(int i=0; i<arr1.length; i++){
      for(int j=0; j<arr2.length; j++){
           if(arr1[i] == arr2[j]){
                System.out.println(arr1[i]);

有人可以帮忙输出这两个数组中的共同数字并删除重复数字吗?

谢谢。


如果您不想有重复项,请使用集合。 - JF-Mechs
你有数组而不是列表的数组。接下来,在循环中,不要打印数字,而是将其添加到一个“Set”中,然后在循环外打印数字。 - TheLostMind
在double类型中搜索重复项是危险的,因为它们可能在一个不可见的小数位上有所不同。如果您需要两个小数位,请将值乘以100并将其转换为int或long类型。 - Robert
4个回答

1

将您的值存储在一个集合中。集合可以自动消除重复项。

 Set<Double> set = new HashSet<Double>();

 for(int i = 0; i < arr1.length; i++){
   set.add(arr1[i]);
 }
 for(int j = 0; j < arr2.length; j++){
   set.add(arr2[j]);
 }

 Double[] array = set.toArray(new Double[0]);
 // Output goes here
 System.out.println(Arrays.toString(array));

如果arr1的长度和arr2相同,你可以在一个for循环中处理它们。

1

流是怎么样的呢?可能更有效率(不需要创建一个集合)和更快(请见并行区别和排序)

 double[] arr1 = {100.00, 100.00, 17246.40, 2568.00, 0.20, 9845.00, 5768.18, 0.20, 30.00,
            63.68, 83.56, 444.39, 144.20, 2889.00};

    double[] arr2 = {2000.90, 508.07, 100.00, 17246.40, 5899.38, 17246.40, 17246.40, 2568.00,
            83.56, 144.20, 2889.00, 3000.00, 2568.00, 60.00, 3135.00, 28329.91, 3135.00, 9845.00};

    DoubleStream stream1 = Arrays.stream(arr1);
    DoubleStream stream2 = Arrays.stream(arr2);
    Stream<Double> concat = Stream.concat(stream1.boxed(), stream2.boxed());
    concat.parallel().distinct().sorted().sequential().forEach(System.out::println);

由于没有人在此之前发布输出:

0.2
30.0
60.0
63.68
83.56
100.0
144.2
444.39
508.07
2000.9
2568.0
2889.0
3000.0
3135.0
5768.18
5899.38
9845.0
17246.4
28329.91

0

这个怎么样?

for(int i=0; i<arr1.length; i++){
      for(int j=0; j<arr2.length; j++){
           if(arr1[i] == arr2[j]){
                System.out.println(arr1[i]);
                break;
           }
      }
}

你得到了重复的值,因为你正在将第一个数组的每个元素与另一个数组的所有元素进行比较。因此,如果第二个数组中的某个值出现两次,它将被打印出来。当匹配到一个项目时,只需打破内部循环,它就会删除重复项。


-2
创建一个集合,然后将共同的值简单地添加到其中。
double[] arr1 = {100.00, 100.00, 17246.40, 2568.00, 0.20, 9845.00, 5768.18, 0.20, 30.00, 63.68, 83.56, 444.39, 144.20, 
                2889.00};


double[] arr2 = {2000.90, 508.07, 100.00, 17246.40, 5899.38, 17246.40, 17246.40, 2568.00, 83.56, 144.20, 2889.00, 3000.00, 
                2568.00, 60.00, 3135.00, 28329.91, 3135.00, 9845.00};

Set<Double> set = new HashSet<Double>();

for(int i=0;i<arr1.length;i++){

     for(int j=0;j<arr2.length;j++){
           if(arr1[i]==arr2[j])
                set.add(arr1[i]);
     }
}

System.out.println(Arrays.toString(set.toArray()));

不需要在循环中再嵌套一个循环。你的if语句也是不必要的,因为你可以在集合中只存储一个值。 - osanger
2
欢迎来到Stack Overflow!虽然这段代码可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 - Ferrybig
@dr_debug 是的,但我需要检查共同元素,对吧? - Ann Mathews
@AnnMathews 不需要这样做。 - osanger
@dr_debug 我已经这样做了。它给出的是两个数组中所有元素,没有重复项,正如API所说的那样,我同意。但是,根据我的理解,这里需要的输出是打印出同时存在于两个数组中的元素。 - Ann Mathews
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接