(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/