2017-07-27 19 views
1

在Eclipse Collections框架的HashBag中保存了大量元素。現在應該刪除所有出現次數少於k次的元素。原位刪除HashBag

這可以通過做:

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

不足之處是,這造成在我們的情況下消耗大量的內存中的臨時包實例。

所以,我正在尋找一種就地去除方法,例如,用迭代器。由iterator()返回的迭代器在具有n次出現的元素上迭代n次,這不合適CPU。更好的做法是迭代底層ObjectIntMap的所有不同密鑰。在源代碼中,您可以找到一種方法AbstractHashBag.getKeysView(),但它受保護。有沒有辦法通過公共API或任何其他想法來訪問它,以便就地去除這些元素?

回答

2

如果您可以替換原來的包,而不是改變它,您可以使用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。