2012-04-08 11 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]); 

上記は機能しません。 1つはaaをどのように並べ替えますか?連想配列をソートするには?

+0

指定された順序でrsultsが必要か、または2つの異なるAAインスタンスが同等であることを確認するだけですか? – BCS

+0

@ 'std :: map'と同じように、結果はある順序で必要です。おそらく、 'std.container'を使って終わるでしょう。 – Arlen

答えて

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 :: unordered_map'はソートされていませんが、' std :: map'はソートされています。連想配列の代わりに、おそらく彼らは 'hash'と呼ぶべきです。 – Arlen

+0

@Arlen:PHPをやったことがありますか? – Mehrdad

+0

@Arlen連想配列は完全に有効な用語です。個人的にはハッシュテーブルと呼んでいましたが、連想配列と呼ぶのは完全に正確です:http://en.wikipedia.org/wiki/Associative_array –