0

キーをコピーするときに、このハッシュマップの問題で立ち往生しています。(アンドロイド)

最初に、これに似たxmlファイルがありました

<many_people>
  <people>
    <id>1</id>
     <name>Johnson</name>
     <tel_num>12345678</tel_num>
  </people>
     .
     .
     .
</many_people>

だから私はハッシュマップでarraylistを作成してxml全体を保存しました

for (int i = 0; i < nl.getLength(); i++) {
        map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
        map.put(KEY_TELNUM, parser.getValue(e, KEY_TELNUM));

        // adding HashList to ArrayList
        peopleList.add(map);
    }

入力を xml と比較できるように、onItemClickListener を使用して AutoCompleteTextView からの入力をキャプチャしました。peopleList は後で listView で使用されます。

例: 入力 - ジョンソン と比較して、見つかった場合、私のリスト ビューにはジョンソンの名前と連絡先が一緒に表示されます。ここに問題があります。Johnson が 2 つある場合、listView は xml の最初の Johnson のみを読み取ります。入力をxmlと比較する方法がわかりません。以下は私のコードです:

for (HashMap<String, String> map : peopleList) {
  if (input.equals(map.get(KEY_NAME))) {
      // At here I created another hashmap with copying the value
      map2.put(KEY_ID, map.get(KEY_ID));
      map2.put(KEY_NAME, map.get(KEY_NAME));
      map2.put(KEY_NAME, map.get(KEY_TELNUM));
      peopleList2.add(map2);
    }
}    

listView に最初のデータを表示することに成功しましたが、2 番目と 3 番目のデータ (Johnson と同じ名前) は失敗しました。これがその方法であるかどうかはわかりません。

4

2 に答える 2

1

同じ値を持つ 2 つの値keyを a に入れるとHashMap、最初の値が 2 番目の値で上書きされます。入力する各「人」が一意であることを確認して、前の人を上書きしないようにする必要があります。(注:これは本当ですが、あなたの問題ではありません)

提案: オブジェクトを作成し、Person各人物のデータをこの新しいオブジェクトに入力します。Person次に、ハッシュマップに挿入します。equalsマップに効率的に入力されるように、新しいオブジェクトにおよびhashCode関数を実装することを忘れないでください。

編集:元のコードを読み間違えました。はるかに悪い問題があります。dmon が言ったように、for ループを介してループごとに新しいハッシュマップを作成し、そこに 4 つのものだけを格納するのはなぜですか? これは信じられないほど非効率的であり、ハッシュマップをまとめて削除する必要があります。Person各人のハッシュマップではなく、クラスをリストに保存します...

于 2012-12-23T21:05:05.393 に答える
1

ここに:

for (HashMap<String, String> map : peopleList) {
  if (input.equals(map.get(KEY_NAME))) {
      // At here I created another hashmap with copying the value
      map2.put(KEY_ID, map.get(KEY_ID));
      map2.put(KEY_NAME, map.get(KEY_NAME));
      map2.put(KEY_NAME, map.get(KEY_TELNUM));
      peopleList2.add(map2);
    }
}    

ここで、値をコピーして別のハッシュマップを作成しました

それが FOR ループ コード全体である場合、別のマップを作成していないことは間違いありません。同じ HashMap ( map2) を何度も更新してリストに追加しているだけです。同じ HashMap を使用しているため、同じオブジェクトを何度も更新し、同じ「人」への N (一致の数) の参照で終了します。

Michael が言ったように、これには理由はありません。Person クラスを作成する必要があります。

于 2012-12-23T21:47:35.727 に答える