2015-09-29 12 views
5

私はデータをLinkedHashMapのkeySet()から作成されたArrayListは、挿入順序を保持していますか?

{ "ABCの従業員1"、 "ABCX"}、{ "ABCの社員2"、 "ABCY"}、 { "ABCの社員3" のようなものを取得し、「ABCZ "}

からRefCursorまでです。

データベースからデータを読み込む順番を維持する必要がある場合があります。 私のデータは一種の「キー・バリュー」なので、私はMapの実装を使って注文しました。従って私はそれがデータベース(カーソル)から取得された同じ順序で、クライアントにキーを渡す必要がLinkedHashMap

//defined as a static map inside a common utlity class 
public class Common{ 
public static final LinkedHashMap<String, String> empMap = new LinkedHashMap<String, String>(); 
} 

//rs is the resultset 
if (rs != null) { 
      while (rs.next()) { 
       key = rs.getString("name_text"); 
       value = rs.getString("id"); 
       Common.empMap.put(key, value); 
      } 
} 

を選びました。

​​

のkeySet() - ドキュメントは、「このマップに含まれるキー のSetビューを返し言う マップへの変更はセットに反映されているのでセットは、マップによって支えられています。そして、私は期待して何その逆」

ArrayListも注文したコレクションですので、私はそれはMapに挿入/取り出されたのと同じ方法でキーを取得する必要があることです。

サンプルテストプログラムを実行すると、期待どおりになっています。

public class LinkedMap {  
    public static void main(String[] args) { 
     LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();   
     map.put("Employee 1 of ABC", "ABCX"); 
     map.put("Employee 2 of ABC", "ABCY"); 
     map.put("Employee 3 of ABC", "ABCZ"); 
     ArrayList<String> list = new ArrayList<String>(map.keySet()); 
     System.out.println(list); 
    } 
} 

出力:これは出力を保証されているか、ということであれば[ABCの従業員1、ABCの従業員2、ABCの従業員3]は

しかし、私の質問は、あるI (?)だけランダムに取得しています、そして、それは異なる場合があります、

更新日:2015年9月30日

ありがとうございました、あなた一人一人が有効なポイントを寄付しました。

順序が維持されることが保証されている、すべての答えを要約します。

Javadocs 1としてのLinkedHashMapは、予測可能な繰り返し順序を持つ、ハッシュテーブルと地図 インタフェースのリンクリストの実装です。この実装 は、すべてのエントリを通じて を実行している二重リンクリストを維持しているという点でHashMapと異なります。このリンクリストは、キーが マップ(挿入順)に挿入された順序が通常である反復 順序を定義し

すなわち:LinkedHashMapは、エントリが投入された順序で反復します地図

のでLinkedHashMap#keySet()は私に指定された順序で LinkedHashMap#keySet().iterator()反復処理するためのキーは、マップに挿入されたのと同じ順序を与えるでしょう。我々はそれを見ることができますiterator()の実施に深く行く

のLinkedHashMapは、「発注」

// These Overrides alter the behavior of superclass view iterator() methods 
Iterator<K> newKeyIterator() { return new KeyIterator(); } ... 

private class KeyIterator extends LinkedHashIterator<K> {... 

private abstract class LinkedHashIterator<T> implements Iterator<T> { ... 
の世話をして、LinkedHashIteratorを継承したクラスのインスタンスを返すメソッドのnewKeyIteratorを()を実装しますこのため

ArrayList<String> list = new ArrayList<String>(map.keySet()); コンストラクタのArrayList(コレクション)は順序というelemeにリストを埋めるためにdocumentedです指定されたCollectionのイテレータによってntsが返されます。

+0

私は変数型が曖昧な 'Map'ではなく、最も具体的な' LinkedHashMap'であることを好きです:) – ZhongYu

+0

私は、インタフェースや具体的なクラス参照を使用しても私の使用事例に違いはないと思います。しかし、私はインターフェイスではなく具体的​​なクラスを使用するのは間違いだったと認めなければなりません。それとも違う気がしますか? – spiderman

+0

いいえ、ローカル変数とインスタンス変数に最も特殊な型を使用することをお勧めします。 – ZhongYu

答えて

4

は、です。

自体にSetインタフェースは(まあ、LinkedHashSetはない)任意の順序を保証するものではありませんが、Map実装自体はかなりの発注挿入を保証しているという事実は、あなたにもこの順でキーを取得することを保証します。 .keySet()によって返されるインターフェイスは、Mapのキーが一意であることが保証されているため、ちょうどSetになります。それがなかったら

は、このような状況で何が起こるかを考えてみます。これら2つのコードが2つの異なる動作を持っていた場合

// case 1 
for (final Map.Entry<K, V> entry: map.entrySet()) { 
    // entry.getKey(), entry.getValue() 
} 

// case 2 
for (final K key: map.keySet()) { 
    V value = map.get(key); 
} 

、ええと...

+0

ありがとうございました+1、 ".keySet()によって返されたインターフェイスはちょうどセットになりました - この' Set'を考えると私は混乱していました – spiderman

+0

私は2つのコード:( – spiderman

+0

この2つのコードが異なる順序で反復された場合、あるいは.values()? – fge

2

はい、それが保証されています。

Oracle JDKでは、クラスLinkedHashMapは、LinkedHashIteratorを継承するクラスのインスタンスを返すメソッドnewKeyIterator()を再インプリメントします。それが注文されます。

+0

非常に有効な+1、+1私はこれを見るためにそれにダイブしました:) – spiderman

1

他の回答は、指定された順序でそのLinkedHashMap#keySet().iterator()繰り返し処理を説明するので、私はちょうど追加してみましょう:

ArrayListのJavadocを約ArrayList(Collection)言う:

はで、指定されたコレクションの要素を含むリストを作成しますそれらはコレクションのイテレータによって返されます。

したがって、ArrayListアイテムは同じ順序であることが保証されています。

+0

ありがとう+1 – spiderman

1

LinkedHashSetの反復順序は、キーが挿入される順序と同じであることが保証されています(代わりに最新のアクセスによる順序付けを要求する特別なコンストラクターを使用しないと仮定します)。これはits documentationで見つけることができます。

は、私はあなたが繰り返し順序保証がない他のビューに、唯一のエントリのセットに適用されると主張することができたとしますが、ドキュメントが良く(彼らは反復順序を参照する限り)それをサポートしていませんし、実際にはコレクションビューは共通の反復順序を共有します。

コンストラクタArrayList(Collection)is documented指定されたCollectionのイテレータによって要素が返される順序でリストを埋めるためのコンストラクタです。

1

Does entrySet() in a LinkedHashMap also guarantee order?で説明したように、JavaDocsに記載されているように、反復型操作はLinkedHashMapの挿入順に定義されています。これはのようにkeySetに影響します。

ArrayListのコンストラクタは、イテレータの順序でListに挿入されます。

これらの2つの条件を組み合わせると、APIによってこの動作が保証されます。

+0

良いもの、参照用に+1 – spiderman

関連する問題