Java按频率重复排序列表

时间:2015-06-15 18:36:27

标签: java treeset

是否存在按频率排序的非重复“列表”实现?

例如:

TreeSet<String> cities = new TreeSet<String>();

cities.add("NYC");    // Ordered list is [NYC]
cities.add("Boston"); // Ordered list is [Boston, NYC] (alphabetical order)
cities.add("NYC");    // Ordered list is [NYC, Boston] because NYC was added twice
cities.add("Philly"); 
cities.add("Philly");
cities.add("Philly"); // Ordered list is now [Philly, NYC, Boston] 

2 个答案:

答案 0 :(得分:3)

这对于基本的JDK来说很棘手,而对于纯Set则不行,但如果第三方库是公平游戏,则可以使用Guava's Multiset。方法Multisets.copyHighestCountFirst按给定的多个元素排序每个元素的出现次数。

答案 1 :(得分:1)

我不认为有任何标准库类可以有效地支持这些功能。最佳实现取决于您希望使用哪些操作的频率(添加,删除,查找最大值,删除最大值,按顺序遍历,...)。

一个特殊情况是,如果您只添加和删除元素,并且只是不时地想要按顺序遍历/列出所有元素,在这种情况下,我建议遵循以下实现:

要添加和删除,请将您的数据存储在名称映射到频率的任何Map<String, Integer>(例如HashMapTreeMap)中,以便快速添加和删除。如果您需要按频率列出名称,只需将所有数据拉到List并使用合适的比较器进行排序。

但是,如果您想要在每次插入后查看最大元素,则先前的实现会失败。在这种情况下,我会使用一些混合结构,例如组合map和heap(使用两者),map用于快速名称查找和堆用于选择具有最大频率的元素。