在HashBag
(Eclipse Collections框架)中保存了大量元素。现在应删除所有出现次数少于k的元素。
这可以通过以下方式完成:
bag.removeAll(bag.selectByOccurrences(n->n<k));
下行是,这会创建一个临时包实例,在我们的例子中会占用大量内存。
所以我正在寻找一种就地删除方法,例如用迭代器。 iterator()
返回的迭代器在n次出现的元素上迭代n次,这不适合CPU。更好的是迭代底层ObjectIntMap
的所有不同键。在源代码中,您可以找到方法AbstractHashBag.getKeysView()
,但它受到保护。有没有办法通过公共API或任何其他想法访问它以便就地删除这些元素?
答案 0 :(得分:3)
如果你可以替换原始包,而不是改变它,你可以使用带有反向谓词的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
的{{1}}上添加新方法会很有用。如果您想创建问题和/或为库做出贡献,我认为添加为API是有意义的。