2012-04-08 38 views
3
float[float] aa = [2.2:7.7, 3.3:6.6, 1.1:4.4]; 
std.sort(aa); 
assert(aa == [1.1:4.4, 2.2:7.7, 3.3:6.6]); 

上述不起作用。如何排序aa如何對聯合數組進行排序?

+0

您是否需要給定順序的rsults,或者您是否需要檢查兩個不同的AA實例是否相同? – BCS 2012-04-08 16:09:37

+0

@我需要給定順序的結果,就像'std :: map'一樣。我可能最終會使用'std.container'。 – Arlen 2012-04-08 17:14:25

回答

7

D的內置關聯數組是hash tables。它們是未分類的,對它們進行分類是沒有意義的。只有在遍歷AA時,排序纔會有意義,並且需要將它們放入新的容器中。所以,你可以做類似

auto keys = aa.keys; 
sort(keys); 

但你不能排序AA本身。如果你想要一個有排序的地圖,那麼你需要使用像std.container.RedBlackTree這樣的東西 - 儘管它需要一點工作來使它起到一個映射而不是一個集合的作用(例如,排序函數只能在鍵上排序,將東西傳遞給一些函數,你需要一個帶有虛擬值的元組)。

這就是爲什麼Java有HashMapSortedMap以及爲什麼C++有unordered_map(C++ 11)和map。它們都是地圖,它們都具有非常不同的特徵 - 特別是在排序和查找時間方面。

6

你不能 - 它沒有意義。

關聯數組也被稱爲「詞典」或「地圖」; D中的特定變體是散列表。他們是而不是陣列。排序他們將打破他們的能力給你一個快速的查找時間。

如果您需要快速查找時間,請考慮使用RedBlackTree代替。

+0

'std :: map'被排序,而'std :: unordered_map'不是。也許他們應該把它稱爲「哈希」,而不是關聯數組。 – Arlen 2012-04-08 06:12:50

+0

@Arlen:你之前做過PHP嗎? – Mehrdad 2012-04-08 06:42:55

+0

@Arlen關聯數組是一個完美有效的術語。就個人而言,我會稱它爲散列表,但將其稱爲關聯數組是完全正確的:http://en.wikipedia.org/wiki/Associative_array – 2012-04-08 07:30:09