0

复制密钥时,我陷入了这个哈希图问题。(安卓)

最初我有一个类似的 xml 文件

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

所以我用hashmap创建了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);
    }

我使用 onItemClickListener 来捕获来自 AutoCompleteTextView 的输入,以便我可以将输入与 xml 进行比较。peopleList 稍后将在 listView 中使用。

例如:输入 - Johnson 与 比较,如果找到,那么我的列表视图将显示 Johnson 的姓名和联系人。问题就在这里,如果我有 2 个约翰逊,listView 只会读取我在 xml 中的第一个约翰逊。我不知道如何将输入与 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 中显示了第一个数据,但第二个和第三个数据(与 Johnson 同名)失败了。我不确定这是否可行。

4

2 回答 2

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 循环代码,那么您肯定没有创建另一个地图。您只是map2一遍又一遍地更新相同的 HashMap ( ) 并将其添加到列表中。由于您使用的是相同的 HashMap,因此您将一遍又一遍地更新同一个对象,以对同一“人”的 N(匹配数)引用结束。

就像迈克尔说的那样,没有理由这样做,你应该创建一个 Person 类。

于 2012-12-23T21:47:35.727 回答
1

如果将两个相同key的值放入 a 中HashMap,则第一个被第二个覆盖。您需要确保您输入的每个“人”都是唯一的,这样它就不会覆盖以前的人。(注意:这是真的,但这不是你的问题)

建议:创建一个Person对象,将每个人的数据输入到这个新对象中。然后插入Person到您的哈希图中。请记住为您的新对象实现equalshashCode函数,以便将其有效地输入到地图中。

编辑:我误读了您的原始代码。还有更糟糕的问题。正如 dmon 所说,你为什么要通过 for 循环为每个循环创建一个新的 hashmap,然后只在其中存储 4ish 的东西?这是非常低效的,您应该一起摆脱哈希图。将Person课程存储在您的列表中,而不是每个人的哈希图...

于 2012-12-23T21:05:05.393 回答