我有一个arraylist,其中包含一些重复的值,我想将这些值收集到另一个Arraylist中。 喜欢
Arraylist<String> one; //contains all values with duplicates
one.add("1");
one.add("2");
one.add("2");
one.add("2");
在这里,我想在另一个arraylist中获取所有重复值...
Arraylist<String> duplicates; //contains all duplicates values which is 2.
我想要那些大于或等于3的值。
当前,我对此没有任何解决方案,请帮助我找出答案
答案 0 :(得分:6)
您可以为此使用一套:
Set<String> set = new HashSet<>();
List<String> duplicates = new ArrayList<>();
for(String s: one) {
if (!set.add(s)) {
duplicates.add(s);
}
}
您只需将所有元素添加到集合中。如果方法add()
返回false,则表示该元素未添加到集合中,即该元素已经存在。
输入:[1, 3, 1, 3, 7, 6]
重复项:[1, 3]
已编辑
对于等于或大于3的值,您可以像这样使用流:
List<String> collect = one.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() >= 3)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
基本上,您是在地图中收集初始列表的,其中key
是字符串,value
是计数。然后,您可以过滤此地图以获取计数值大于3的值,并将其收集到结果列表中
答案 1 :(得分:2)
您也可以通过信息流执行此操作:
List<String> duplicates = one.stream()
.collect(Collectors.groupingBy(Function.identity(), counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toCollection(ArrayList::new));