2011-09-14 17 views
0

この不明な質問を投稿していただきまして申し訳ありません。これは私の初めてのhashmapを使用しているので、私は混乱していました。この問題をより良い方法で説明しようとしました。store key values of hashmap in string[]文字列[]内のソート済みハッシュマップのSystoreキー値

私は値に基づいてソートされたハッシュマップを持っています。ソートされたマップからキーを抽出し、String []配列に格納したいと思います。キーの順序(値でソート)は重要です。 Iの値にハッシュマップを並べ替えるために、このコードを使用する - http://www.xinotes.org/notes/note/306/

キー配列を抽出するために、私は

しかし、この方法のdidntの作業(ここでHMはハッシュマップである)

String[] keys = (String[])(hm.keySet().toArray(new String[hm.size()])) 

を試みました。キーストリング[]にはキーがありますが、ソート順ではありません。


アップデート: 私はのLinkedHashMapを使用して配列のソート済みキー値を格納することができました。 Hereはコードのリンクです。

+3

"ソートされたハッシュテーブル"がありますか?正確にはどういう意味ですか? –

+0

何がうまくいかなかったのですか?あなたが期待したとおりの注文ではありませんでしたか? – amit

+0

申し訳ありませんが、私は値に基づいてハッシュマップをソートしました – Umang

答えて

0

HashMapはkey.hashValue()を使用して値をソートします。代わりにTreeMapを使用してください。

+0

いいえ、並べ替えの何もしません。 – EJP

+0

とにかくソートされたハッシュマップからキー値を抽出し、文字列[]として保存しますか? – Umang

+0

@Umangはい、あなたはあなた自身であなたの質問にそれをしました。 – EJP

0

私は、値に基づいてソートされたハッシュマップを持っています。 値に基づいてハッシュマップをソートしました

いいえ、あなたは持っていません。 HashMapはまったくソートされません。 values()はCollectionとして取得でき、好きなようにソートできますが、HashMap自体はソートされません。

しかし、このメソッドは機能しませんでした。鍵はランダムに格納されます。

特に、HashMapをまったく並べ替えていないので、特に何もすることは定義されていません。

あなたはここで何を話しているのかを明確にする必要があります。値をソートする場合は、上記を行います。キーをソートする場合は、values() 'の代わりにkeys()で上記を行います。マップ自体をキーでソートする場合は、TreeMapを使用します。 Map自体を値でソートしたい場合は、不運にすることはできません。

+0

ハッシュマップ自体はソートされていません。ハッシュマップを作成してソートしたということです。 – Umang

+0

ソートがどのように行われたかのリンクの質問が表示されます – Umang

+0

@UmangそのリンクはHashMapのソートをまったく実証していません。ソートされたListを返すコードを示します。 HashMapには何も行われていません。 – EJP

2

typoとハッシュマップを使用していることに基づいて、キーの検索順序は挿入順序と一致しません。そのためにLinkedHashMapを使用してください。これは、外部ソートを行い、ソートされたエントリをマップに挿入することです。

エントリがマップに挿入されている間にソートされるようにするには、TreeMapを使用します。カスタムコンパレータを使用するか、キーオブジェクトにComparableインターフェイスを実装させることができます。

+0

または「自然順序」のツリーマップ。 – Thilo

+0

またはTreeMapを使用して任意の順序で比較することができます。 – EJP

+0

@EJP:はい、すでに答えに記載されています(任意の順序のカスタムコンパレータまたは自然順序付けのComparable)。たぶん私はカスタムコンパレータは通常、非定型的な順序で使用され、自然順序付けに匹敵することを明示する必要がありました。 – Scorpion

0

このお試しください:それはあなたがHashMapのキーの順序は、キーのあなたのソートされたリストと同じようにしたいように思わ

key: AAA 
key: ABB 
key: BBB 
0

:出力は次のようになり

public static void main(String[] args) { 
    Map<String, String> hm = new TreeMap<String, String>(); 
    hm.put("AAA", "typeAAA"); 
    hm.put("BBB", "typeBBB"); 
    hm.put("ABB", "TypeABB"); 
    String[] keys = hm.keySet().toArray(new String[0]); 
    for (String key : keys) { 
     System.out.println("key: " + key); 
    } 
} 

を。これはで、簡単にはできません。HashMapのキーは、ハッシュテーブルアルゴリズムによって決定されます。例えばキーのハッシュ値と挿入と削除のシーケンスに依存する複雑なプロセスです。

最も近いのはLinkedHashMapを作成し、古い番号HashMapのエントリをソートされたキーの順に挿入して入力します。その後、LinkedHashMapのキーを反復すると、挿入された順にそれらのキーが返されます。しかし、これは重量の重い解決策であり、その後、「ソートされた」マップにエントリを追加しなければならなくなった場合には分解されます。 TreeMapを使用する方が良いかもしれません。


私はハッシュマップに変更を加えたくありません。私はちょうどソートされた値の順序でキーを持つ配列を取得したい。

この場合、HashMapのキーを配列に抽出して並べ替えるだけで済みます。コードは他の答えで与えられています。

一方、マップのキーが常にソートされた順序で出てくるようにしたい場合(他のコメントで言うように)、です。

+0

私はハッシュマップに変更を加えたくありません。私はちょうどソートされた値の順序でキーを持つ配列を取得したい。ありがとう。 – Umang

+0

ありがとう。それを調べます。 – Umang

関連する問題