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

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

下面的代码给出的输出为一二三。 但我只需要打印唯一的非重复元素,即只出现一次的三个元素。 为了从 1,2,3,3,2,4,5,5,4,6,6,7 的 arrayList 中更清楚,我只需要得到不重复的 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); ```

我会为这项工作使用流:

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

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

您可以先使用分组收集器,然后仅使用一个元素过滤这些列表:

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);

您需要从流中过滤出频率为 1.

的元素(源自列表)

按如下操作:

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);
    }
}

输出:

[Three]

所有其他答案都会进行不必要的计算或使用比需要更多的内存,因此:

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()));