是否存在按频率排序的非重复“列表”实现?
例如:
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]
答案 0 :(得分:3)
这对于基本的JDK来说很棘手,而对于纯Set
则不行,但如果第三方库是公平游戏,则可以使用Guava's Multiset
。方法Multisets.copyHighestCountFirst
按给定的多个元素排序每个元素的出现次数。
答案 1 :(得分:1)
我不认为有任何标准库类可以有效地支持这些功能。最佳实现取决于您希望使用哪些操作的频率(添加,删除,查找最大值,删除最大值,按顺序遍历,...)。
一个特殊情况是,如果您只添加和删除元素,并且只是不时地想要按顺序遍历/列出所有元素,在这种情况下,我建议遵循以下实现:
要添加和删除,请将您的数据存储在名称映射到频率的任何Map<String, Integer>
(例如HashMap
或TreeMap
)中,以便快速添加和删除。如果您需要按频率列出名称,只需将所有数据拉到List
并使用合适的比较器进行排序。
但是,如果您想要在每次插入后查看最大元素,则先前的实现会失败。在这种情况下,我会使用一些混合结构,例如组合map和heap(使用两者),map用于快速名称查找和堆用于选择具有最大频率的元素。