繁体   English   中英

如何在 Java 的 HashSet 中仅打印唯一的非重复值?

[英]How to print only unique non repeated values in a HashSet in Java?

下面的代码将 output 显示为一二三。 但我只需要打印唯一的非重复元素,即只出现一次的三 为了更清楚地从 arrayList 说 1,2,3,3,2,4,5,5,4,6,6,7,我只需要得到不重复的 1,7。

ArrayList<String> aListNumbers = new ArrayList<String>();
        aListNumbers.add("One");
        aListNumbers.add("Two");
        aListNumbers.add("One");
        aListNumbers.add("Two");
        aListNumbers.add("Three");
  
        HashSet<String> hSetNumbers = new HashSet(aListNumbers);
        System.out.println("ArrayList Unique Values");
        for(String strNumber : hSetNumbers)
            System.out.println(strNumber); ```

每个其他答案都会进行不必要的计算或使用比需要更多的 memory ,所以:

Map<String, Long> counted  = aListNumbers.stream()
    .collect(Collectors.groupingBy(el -> el, Collectors.counting()));

counted.entrySet().stream()
    .filter(entry -> entry.getValue() == 1)
    .forEach(entry -> System.out.println(entry.getKey()));

您可以首先使用 grouping-by 收集器,然后使用一个元素过滤这些列表:

List<String> aListNumbers = new ArrayList<>();
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("One");
aListNumbers.add("Two");
aListNumbers.add("Three");

aListNumbers.stream()
        .collect(Collectors.groupingBy(x -> x))
        .values()
        .stream()
        .filter(l -> l.size() == 1)
        .map(l -> l.get(0))
        .forEachOrdered(System.out::println);

编辑:只是想到了另一种我觉得更优雅的方法:

aListNumbers.stream()
        .collect(Collectors.groupingBy(x -> x, counting()))
        .entrySet()
        .stream()
        .filter(e -> e.getValue() == 1)
        .map(Entry::getKey)
        .forEachOrdered(System.out::println);

我会使用流来完成这项工作:

Set<String> hSetNumbers = aListNumbers.stream().distinct()
        .filter(num1 -> aListNumbers.stream().filter(num1::equals).count() == 1)
        .collect(Collectors.toSet());

hSetNumbers.forEach(System.out::println);

您需要从频率为1的 stream (来自列表)中过滤元素。

执行以下操作:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> aListNumbers = new ArrayList<>(List.of("One", "Two", "Three", "One", "Two"));
        Set<String> hSetNumbers = aListNumbers
                                .stream()
                                .filter(e -> Collections.frequency(aListNumbers, e) == 1)
                                .collect(Collectors.toSet());

        System.out.println(hSetNumbers);
    }
}

Output:

[Three]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM