1

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

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

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

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

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

4

1 回答 1

3

如果您可以替换原始包,而不是对其进行变异,则可以将 theselectByOccurrences与反向谓词一起使用。

如果这不起作用,以下解决方案仍会创建一个临时包,但应该比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对于这个用例,在called上添加一个新方法似乎很有用removeIfOccurrences(IntPredicate)。如果您想创建问题和/或为库做出贡献,我认为将其添加为 API 是有意义的。

于 2017-07-27T21:48:29.463 回答