是否认为在集合类型之间进行转换是不好的形式?

The*_*111 5 java collections list bag

我希望这个问题具体到足以被认为适合StackOverflow.我检查了常见问题解答,我认为这符合资格,因为它是特定的并且与编程有关.

我正在Java中实现复杂的数据挖掘算法(FP-growth).算法的一些初始阶段要求我扫描大型数据库并保持找到的每个项目类型的运行计数.这似乎非常适合Hashbag界面.我在Apache Commons中找到了一个似乎对我有用的东西.

所以现在,我的HashBag填充了[itemType,count]条目(对).稍后在算法中,我需要在这些对上做很多类似列表的操作.在某些情况下,我必须按itemType对集合进行排序.在其他人中,我必须按计数排序.这似乎非常适合List界面.

我得出的结论是,我必须将我的Hasbag转换为List.但它在某种程度上感觉很脏,就像浪费空间和时间.是否有一种更聪明的方法可以做到这一点,或者是一个常见的情况,如果你必须在不同的时间以不同的方式处理你的收藏,那么转换是必要的恶魔?

另一种方法是制作我自己的界面,这是一个真正的列表,但允许"袋式"添加.每次我想添加一些东西时,我必须保持列表排序并使用自定义比较器执行二进制搜索.构建该集合可能比构建Hashbag需要更长的时间,但我会在最后保存转换步骤.有什么想法更好吗?

谢谢!

Lou*_*man 3

如果您使用Guava 的 Multiset而不是 Apache 的Bag(大致类似,但风格不同),则无需转换即可完成大部分工作。 Multiset.entrySet()返回 a Set<Entry<E>>Entry<E>有效地表示一对元素和一个计数——这听起来可能是满足您对元素计数对进行操作的需求的最佳方法,也许吧?您可以像迭代Map.entrySet().

您可以使用Multisets.copyHighestCountFirst(Multiset)获取按最高频率优先顺序重新排序的多重集,并使用TreeMultiset直接按元素排序。

(披露:我为 Guava 做出了贡献。)