【问题标题】:HashBag in-place removeHashBag 就地删除
【发布时间】:2017-07-28 12:22:06
【问题描述】:

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

这可以通过:

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

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

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

【问题讨论】:

    标签: java eclipse-collections


    【解决方案1】:

    如果你可以替换原来的包,而不是改变它,你可以只使用带有反向谓词的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 是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多