[英]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.