我有一个 HashMap 类型的数组列表:
public static ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
它有一些像这样的 ID 和名称:
这是用于循环的代码:
for (HashMap<String, String> map : mylist)
for (Entry<String, String> entry : map.entrySet())
if(entry.getValue().contains(typedText)){
map1 = new HashMap<String, String>();
map1.put("id", entry.getKey());
map1.put("name", entry.getValue());
mylist1.add(map1);
}
问题在于这一行:
for (Entry<String, String> entry : map.entrySet())
map.entrySet()
显示正确的 ID 和名称,如下所示:
但只有 Name 可用于“entry”:
entry.getKey()
始终返回作为键的文本“name”,entry.getValue()
返回作为值的“Katie Bailey”。
我的问题是为什么我没有通过 entry.getKey() 获取 key ?为什么每次迭代我总是将“名称”作为键?
最佳答案
我怀疑您对调试器的 map 可视化感到困惑。当它显示这个时:
{id=2990511, name=Katie Bailey}
这表明您的 map 有两个条目 - 一个键为 id
,值为 "2990511"
,另一个键为 name
和 “Katie Bailey”
的值。
然后您将遍历所有这些条目,如果值匹配,您将两个条目添加到第二个映射中:一个条目具有键 id
和一个值是键您正在查看的条目,以及带有键 name
和一个值的第二个条目,该值是您正在查看的条目的值。您没有使用整个原始 map - 您只是使用了那个单一条目。
因此,如果您匹配 name=Katie Bailey
的条目,您最终会得到一个包含两个条目的新 map :
{id=name, name=Katie Bailey}
您并不清楚您的期望是什么,但您显示的结果对您的代码来说非常有意义。
我怀疑你实际上想要这样的东西:
for (HashMap<String, String> map : mylist) {
String name = map.get("name");
if (name.contains(typedText)) {
// Create a copy of the whole map
mylist1.add(new HashMap<String, String>(map));
}
}
如果你有固定键,你至少应该考虑创建一个类型来封装数据——例如具有 getName()
和 getId()
方法的 Person
类。
关于java - 循环 HashMap 不返回正确的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18733589/