Siv*_*iva 70 java lambda java-8 java-stream
我试图列出整数列表中的重复元素,例如,
List<Integer> numbers = Arrays.asList(new Integer[]{1,2,1,3,4,4});
Run Code Online (Sandbox Code Playgroud)
使用jdk的Streams 8.有没有人试过.要删除重复项,我们可以使用distinct()api.但是如何找到重复的元素呢?有人可以帮帮我吗?
小智 112
你可以使用Collections.frequency
:
numbers.stream().filter(i -> Collections.frequency(numbers, i) >1)
.collect(Collectors.toSet()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
Dav*_*ave 49
你需要一个set(allItems
下面)来保存整个数组内容,但这是O(n):
Integer[] numbers = new Integer[] { 1, 2, 1, 3, 4, 4 };
Set<Integer> allItems = new HashSet<>();
Set<Integer> duplicates = Arrays.stream(numbers)
.filter(n -> !allItems.add(n)) //Set.add() returns false if the item was already in the set.
.collect(Collectors.toSet());
System.out.println(duplicates); // [1, 4]
Run Code Online (Sandbox Code Playgroud)
Rob*_*bAu 31
基本的例子.上半部分构建频率图,后半部分将其缩小为过滤列表.可能不如Dave的答案那么高效,但更多功能(如果您想要检测到两个等)
List<Integer> duplicates = IntStream.of( 1, 2, 3, 2, 1, 2, 3, 4, 2, 2, 2 )
.boxed()
.collect( Collectors.groupingBy( Function.identity(), Collectors.counting() ) )
.entrySet()
.stream()
.filter( p -> p.getValue() > 1 )
.map( Map.Entry::getKey )
.collect( Collectors.toList() );
Run Code Online (Sandbox Code Playgroud)
Tag*_*eev 13
我的StreamEx库增强了Java 8流,它提供了一种特殊操作distinct(atLeast)
,只能保留至少出现指定次数的元素.所以你的问题可以像这样解决:
List<Integer> repeatingNumbers = StreamEx.of(numbers).distinct(2).toList();
Run Code Online (Sandbox Code Playgroud)
在内部它类似于@Dave解决方案,它计算对象,支持其他想要的数量,并且它是并行友好的(它ConcurrentHashMap
用于并行化流,但HashMap
用于顺序).对于大量数据,您可以使用加速.parallel().distinct(2)
.
Tho*_*hew 12
O(n)方式如下:
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 4, 4);
Set<Integer> duplicatedNumbersRemovedSet = new HashSet<>();
Set<Integer> duplicatedNumbersSet = numbers.stream().filter(n -> !duplicatedNumbersRemovedSet.add(n)).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
在这种方法中,空间复杂性会增加一倍,但这个空间不是浪费; 事实上,我们现在只将一个副本作为一个集合以及另一个集合,同时删除所有重复项.
你可以像这样得到重复的:
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 4, 4);
Set<Integer> duplicated = numbers.stream().filter(n -> numbers.stream().filter(x -> x == n).count() > 1).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
109454 次 |
最近记录: |