2015-06-15 62 views
2

是否存在按頻率排序的非重複「列表」實現?按頻率排列的Java非重複排序列表

例如:

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] 
+1

不,因爲沒有重複的集合,排序或其他,意味着集合中的所有內容都有1的頻率。您可能需要基於更簡單的類型構建自己的實現,它爲您提供了非重複輸出,同時仍然記住(可能重複的)輸入中的頻率。 – RealSkeptic

+1

我不認爲這已經實施,但自己做起來相當容易。只需使用字符串和「優先級」字段創建對象,然後根據此優先級字段將此對象實現爲「Comparable」。 – River

回答

3

這是棘手的基本JDK,而不是用純Set可行的,但如果第三方庫都是公平的遊戲,你可以使用Guava'sMultiset。方法Multisets.copyHighestCountFirst根據每個元素的出現次數對給定的多集進行排序。

1

我不認爲有任何標準庫類可以有效地支持這種功能。最佳實施取決於您希望使用哪些操作(添加,刪除,查找最大值,刪除最大值,按順序遍歷...)的頻率。


一個特殊情況是,如果你只會添加和刪除元素,只有不時你想遍歷/列表,以便所有的元素,在這種情況下,我建議以下實現:

要添加和刪除,請將您的數據存儲在任何Map<String, Integer>(例如HashMapTreeMap),其中名稱映射到頻率,這將允許快速添加和刪除。如果您需要按頻率列出名稱,只需將所有數據拉到List並使用合適的比較器進行排序。


但是,如果您想要例如在每次插入後查看最大元素,則以前的實現失敗非常嚴重。在這種情況下,我會使用一些混合結構,例如結合地圖和堆(使用兩者),快速名稱查找映射和堆以最大頻率選擇元素。