HashBag就地删除

时间:2017-07-27 08:46:37

标签: java eclipse-collections

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

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

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

下行是,这会创建一个临时包实例,在我们的例子中会占用大量内存。

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

1 个答案:

答案 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是有意义的。