java - 如果某个项目多次出现,则删除列表中该项目的所有实例

标签 java data-structures collections java-8 java-stream

给定一个数字列表:{ 4, 5, 7, 3, 5, 4, 2, 4 }

所需的输出将是:{ 7, 3, 2 }

我想到的解决方案是根据给定的列表在 HashMap 下创建:

Map<Integer, Integer> numbersCountMap = new HashMap();

其中键是列表中的值,值是出现次数。

然后遍历 HashMap 条目集,如果数字包含大于 1 的计数,则从列表中删除该数字。

for (Map.Entry<Int, Int> numberCountEntry : numbersCountMap.entrySet()) {
     if(numberCountEntry.getValue() > 1) {  
        testList.remove(numberCountEntry.getKey());
     }
}

我不确定这是否是解决此问题的有效方法,因为列表上的 remove(Integer) 操作可能很昂贵。此外,我正在创建额外的 Map 数据结构。并循环两次,一次在原始列表上创建 map ,然后在 map 上删除重复项。

能否请您提出一个更好的方法。可能是 Java 8 有更好的实现方式。 我们也可以使用 Java 8 中的 Streams 和其他新结构在几行代码中完成吗?

最佳答案

通过您可以使用的流:

Map<Integer, Long> grouping = integers.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
grouping.values().removeIf(c -> c > 1);
Set<Integer> result = grouping.keySet();

或者正如@Holger 提到的,您只想知道您的列表中是否有多个整数,所以只需执行以下操作:

Map<Integer, Boolean> grouping = integers.stream()
        .collect(Collectors.toMap(Function.identity(),
                x -> false, (a, b) -> true,
                HashMap::new));
grouping.values().removeIf(b -> b);
// or
grouping.values().removeAll(Collections.singleton(true));
Set<Integer> result = grouping.keySet();

关于java - 如果某个项目多次出现,则删除列表中该项目的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62678612/

相关文章:

algorithm - 选择随机元素的数据结构?

c++ - 如何在编译时检查结构的大小?

java - 按降序对对象列表进行排序

Java泛型,不兼容类型错误(继承)

java - 自定义工具栏不存在

c - c中字符串的优先级队列

java - 创建链表的数组列表

java - 如何改变数组中元素的位置

java - 如何找到上次运行的循环?

java - LinkedList Array 中每个索引的 LinkedList