我有一些HashMap
數據結構包含數百個Comparable
對象(比如MyClass
),並且需要將所有值(不是鍵)放在一個單獨的數據結構,然後對其進行排序。從多個HashMap對象創建SortedSet的最佳方式
由於MyClass
對象的數量和到達率,此過程(每毫秒執行至少一次)需要儘可能高效。
的一種方法是使用SortedSet
,大致如下:
HashMap<String, MyClass>[] allMaps = ... // All the HashMaps
SortedSet<MyClass> set = new TreeSet<MyClass>();
Collection<MyClass> c;
for (HashMap<String, MyClass> m:allMaps)
{
c = m.values();
set.addAll(c);
}
它可能更快的有序集合傳遞給set.addAll()
,這可能重新排序TreeSet
在每次插入,或之後每隔幾插入。然而,爲此,需要將List
傳遞給Collections.sort()
,這意味着必須發生從Collection
到List
的轉換,即必須維持另一個性能命中。
此外,可能有另一種更有效的方式來實現相同的目標。
評論?
你需要多快?如果你的地圖只包含「數百個」對象,那麼它不應該成爲一個問題,除非你每隔50毫秒調用一次該方法......另外,我相信**首先會創建一個未排序集合值**然後**將未排序的集合傳遞給sortedSet.addAll方法。但我還沒有測試過,所以這只是一個猜測:-) – assylias
你這樣做的方式已經是正確的路要走。 TreeSet並不是完全依賴於每一個插入;它將元素插入正確的排序位置。每個'add'調用都是'O(log n)'。 –
是的,我的理解 - 創建一個未排序的大集合,然後對其進行排序。那樣,這種排序只能進行一次。 在未排序的集合上調用Collections.sort()可能會比將未排序的集合傳送到已排序的集合的速度更快(稍快)。 它可能會也可能不會被優化出來,但我會避免代碼示例中的中間集合,並執行set.addAll(m.values); – GreyBeardedGeek