私はデータを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が返されます。
私は変数型が曖昧な 'Map'ではなく、最も具体的な' LinkedHashMap'であることを好きです:) – ZhongYu
私は、インタフェースや具体的なクラス参照を使用しても私の使用事例に違いはないと思います。しかし、私はインターフェイスではなく具体的なクラスを使用するのは間違いだったと認めなければなりません。それとも違う気がしますか? – spiderman
いいえ、ローカル変数とインスタンス変数に最も特殊な型を使用することをお勧めします。 – ZhongYu