我有一个哈希映射类型数组列表:
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和名称,如下所示:
但只有名称可用'entry':
entry.getKey()
始终返回文本'name',这是键,entry.getValue()
返回'Katie Bailey',这是值。
我的问题是为什么我没有使用entry.getKey()获取密钥?为什么每次迭代都会将'name'作为关键?
答案 0 :(得分:6)
我怀疑你对调试器对地图的可视化感到困惑。当它显示出来时:
{id=2990511, name=Katie Bailey}
表明您的地图有两个条目 - 一个密钥为id
,值为"2990511"
,另一个密钥为name
,值为{{1 }}
然后循环遍历所有这些条目,如果值匹配,则在第二个地图中添加两个条目:一个条目带有键"Katie Bailey"
,一个值是的键您正在查看的条目,以及第二个条目,其中包含密钥id
和一个值,该值是您正在查看的条目的值。您没有使用整个原始地图 - 您使用该单个条目只是 。
因此,如果您在name
的条目上匹配,则最终会得到包含两个条目的新地图:
name=Katie Bailey
您的期望并不是很清楚,但您展示的结果对您的代码非常有意义。
我怀疑你实际上想要类似的东西:
{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));
}
}
和Person
方法的getName()
课程。
答案 1 :(得分:0)
问题是map只为键获取唯一值,因此,如果地图中存在某个键,则无法在地图中重新插入,这会导致您获得第一个匹配值。
就此而言,你必须提供不同的钥匙才能被替换。对键使用诸如“id”或“name”的字符串意味着键不会改变,值也是如此。