我有List<Person> persons = new ArrayList<>();
,我想列出所有的唯一名称。我的意思是如果有“John”,“Max”,“John”,“Greg”,那么我只想列出“Max”和“Greg”。有什么方法可以用Java流来完成它吗?Java流 - 找到唯一的元素
-1
A
回答
7
我们可以使用流和Collectors.groupingBy
才能算多少次我们每个名字的 - 然后筛选出现不止一次的任何名称:
List<String> res = persons.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() == 1)
.map(e -> e.getKey())
.collect(Collectors.toList());
System.out.println(res); // [Max, Greg]
1
这应该删除所有重复的元素。
List<String> persons = new ArrayList<>();
persons.add("John");
persons.add("John");
persons.add("MAX");
persons.add("Greg");
Set<String> set = new HashSet<String>();
Set<String> duplicateSet = new HashSet<String>();
for (String p : persons) {
if (!set.add(p)) {
duplicateSet.add(p);
}
}
System.out.println(duplicateSet.toString());
set.removeAll(duplicateSet);
System.out.println(set.toString());
1
你可以简单地使用Collections.frequency
检查元素一次出现在列表中,如下图所示过滤重复:
List<String> listInputs = new ArrayList<>();
//add your users
List<String> listOutputs = new ArrayList<>();
for(String value : listInputs) {
if(Collections.frequency(listInputs, value) ==1) {
listOutputs.add(value);
}
}
System.out.println(listOutputs);
4
首先猜解。
persons.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(entry -> entry.getValue() == 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList())
+3
伟大的思想家都认为... :) – alfasin
0
List persons = new ArrayList();
persons.add("Max");
persons.add("John");
persons.add("John");
persons.add("Greg");
persons.stream()
.filter(person -> Collections.frequency(persons, person) == 1)
.collect(Collectors.toList());
0
这是旧的文章,但我想基于自定义收藏家提出另一种方法:
public static <T> Collector<T, ?, List<T>> excludingDuplicates() {
return Collector.<T, Map<T, Boolean>, List<T>>of(
LinkedHashMap::new,
(map, elem) -> map.compute(elem, (k, v) -> v == null),
(left, right) -> {
right.forEach((k, v) -> left.merge(k, v, (o, n) -> false));
return left;
},
m -> m.keySet().stream().filter(m::get).collect(Collectors.toList()));
}
这里我使用Collector.of
创建自定义收集器将在LinkedHashMap
上累积元素:如果元素不存在为键,则其值将为true
,否则将为false
。合并函数仅适用于并行流,它将right
映射合并到left
映射中,方法是尝试将right
映射的每个条目映射到left
映射中,将已存在的键的值更改为false
。最后,修整器函数返回一个列表,其值为true
的映射键。
这种方法可以使用如下:
List<String> people = Arrays.asList("John", "Max", "John", "Greg");
List<String> result = people.stream().collect(excludingDuplicates());
System.out.println(result); // [Max, Greg]
而这里的另一种方法比使用自定义收集简单:
Map<String, Boolean> duplicates = new LinkedHashMap<>();
people.forEach(elem -> duplicates.compute(elem, (k, v) -> v != null));
duplicates.values().removeIf(v -> v);
Set<String> allUnique = duplicates.keySet();
System.out.println(allUnique); // [Max, Greg]
相关问题
- 1. 在矩阵中找到唯一元素
- 2. 查找元素的唯一子节点
- 3. 查找列表中的唯一元素
- 4. 唯一元素ID
- 5. 如何找到没有唯一标识符的硒元素?
- 6. 在列表中找到元素的唯一组合
- 7. 找到给定数字中唯一元素的最快方法
- 8. 找到唯一的三元组
- 9. 的Java 8,流使用JDK 8的流找到重复的元素
- 10. 在列表中找不到非唯一元素不起作用
- 11. 在python列表中查找元组中的唯一元素
- 12. 将外键链接到唯一元素
- 13. 找到一个元素
- 14. 找到与一流的第一要素,采用类追加头元素
- 15. 找到java中父元素下的xml元素的数量
- 16. 找到元素中元素的索引
- 17. Java 8流 - 将元素映射到元素对
- 18. 查找在一列中唯一的元素excel
- 19. BluePrism Spy元素唯一
- 20. 找到的元素
- 21. 查找列表中的唯一元素而不会丢失元素名称
- 22. 找到元素
- 23. 未找到元素
- 24. 如何找到一个小于另一个元素的元素?
- 25. 在流星如何找到一个DOM元素(渲染后)?
- 26. 用于查找列表最大元素的java流的性能
- 27. Java数组,找到相等元素
- 28. Webdriver - 无法找到元素(Java)
- 29. 的HtmlUnit找不到元素
- 30. 在找到元素并执行元素上的操作后找到元素找不到元素
先尝试做一些基础研究:https://开头www.google.co.uk/search?q=java%20stream%20unique。 –
把它收集到一个集合:)实际上,如果你不关心订单,就做一个集合。 – 9000
任何代码尝试在你身边? – MaxZoom