java - HashBag就地删除

标签 java eclipse-collections

(Eclipse Collections 框架的)HashBag 中保存了大量元素。现在所有出现次数少于 k 的元素都应该被删除。

这可以通过以下方式完成:

bag.removeAll(bag.selectByOccurrences(n->n<k));

缺点是,这会创建一个临时包实例,在我们的例子中会消耗大量内存。

所以我正在寻找一种就地删除方法,例如用迭代器。由 iterator() 返回的迭代器对出现 n 次的元素进行 n 次迭代,这不适合 CPU。更好的方法是迭代底层 ObjectIntMap 的所有不同键。在源代码中,您可以找到一个方法 AbstractHashBag.getKeysView() 但它是 protected 。有没有办法通过公共(public) API 访问它或任何其他想法来就地删除此类元素?

最佳答案

如果您可以替换原始包,而不是改变它,您只需使用 selectByOccurrences 和反向谓词即可。

如果这不起作用,以下解决方案仍然会创建一个临时包,但应该比 removeAll(Collection) 更有效。

MutableBag<Integer> bag = Interval.oneTo(10).toBag()
        .withAll(Interval.oneTo(10))
        .withAll(Interval.evensFromTo(1, 10));

// Removes all odd numbers since they only occur twice
bag.selectByOccurrences(n -> n < 3).forEachWithOccurrences(bag::removeOccurrences);

对于此用例,在 MutableBag 上添加一个名为 removeIfOccurrences(IntPredicate) 的新方法似乎很有用。我认为如果您想创建问题和/或为库做出贡献,那么将其添加为 API 是有意义的。

关于java - HashBag就地删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45345703/

相关文章:

java - ReadFile 无法解析为类型

java - 生产代码中的 Eclipse Collection 用法

java - 如何将 ByteObjectHashMap 转换/改编为 JDK Map?

java - 如何在多次运行中安静 FindBugs

java - 具有泛型类型的哈希码

java - 强制 Spring 在运行时使用特定的类代替另一个类

java - 如何检查安装的 Java 版本是适用于桌面版还是仅限浏览器版?

java - 与 Eclipse Collections 中的软值进行映射

java - 您将如何在列表上执行 removeIf 或为 eclipse 集合中的基元设置?

java - 从 Eclipse 集合 IntList/IntIterable 创建 IntStream 和 Stream<Integer>