3

次のような HashMap キーと値のペアの ArrayList があります

ArrayList<HashMap<String, String>> myList = 
            new ArrayList<HashMap<String, String>>();

これらのアイテムを繰り返し処理して一致するものを見つけることができることは理解していますが、これはコストのかかる作業のようです。反復せずに要素を取得する他の方法はありますか?

私のArrayListには次のような値があります

[{Father Name=a, Mother Name=b, Child Name=c, Reg No=1, Tag ID=1}, 
{Father Name=p, Mother Name=q, Child Name=r, Reg No=2, Tag ID=2}, 
{Father Name=x, Mother Name=y, Child Name=z, Reg No=3, Tag ID=3}]

RegNoに基づいて、個々の項目を繰り返さずに父の名前、母の名前、子供の名前を取得したいと考えています。

4

3 に答える 3

1

反復せずに、 HashMap を key で別の HashMap に保存する必要がありますReg NoFamilyオブジェクトまたはそれに類似したものを使用することをお勧めしますが:(HashMap<Integer, Family> registrationこれがOO言語の美しさです:))

class Family {
    String father;
    String mother;
    String child;

    // constructor getters setters
}

Map<Integer, Family> registration = new HashMap(); // note this is a JDK7 future 
//Map<Integer, Family> registration = new HashMap<Integer, Family>(); // the 'old' way
registration.put(regNo, new Family("Jack", "Mary", "Bastard"));

Family family = registration.get(regNo);
String father = family.getFather();
于 2013-05-04T08:55:46.020 に答える
0

ハッシュをリストに格納しているため、順序は一定のままです。つまり、別の配列を作成して Reg No を同じ順序で格納し、その配列で reg no を検索し、検索された値のインデックスに基づいて他の値を取得できます。

于 2013-05-04T08:55:24.910 に答える
0

反復は O(n) ですが、構造へのアクセスを高速化する必要があります...これは、オブジェクトを順序付けられた方法で格納することを意味します ( -> O(log(n)) 通常) または別のハッシュを使用します ( -> O( 1))。
または、これ、または反復を「非表示」にしますが、これは審美的にのみ問題を解決します (xml の getElementsByTagName のようなもの)。

いずれにせよ、特に 'reg no' だけでなく、すべてのフィールド (父/母/子/タグ) に高速にアクセスできるようにしたい場合は、おそらく構造を変更する必要があります。
おそらく別の解決策は、(主キー、データ) のようなキーペアを持つハッシュにプレーン データを格納し、HashMap のすべてのフィールドの PK を複製することですが、これは有効な主キーを検索することを意味するだけでなく、問題が発生する可能性があります。ハッシュのサイズ。

于 2013-05-04T09:16:39.697 に答える