我正在尝试将String
和ArrayList<String>
的值插入HashMap<String, ArrayList<String>>
。 for循环中的代码工作正常,但是在将ArrayList值插入HashMap时,它不会插入我想要的值。
我的代码:
for(int i=0; i<fileNames.length; i++)
{
File imageFile = new File(fileNames[i]);
metadata = ImageMetadataReader.readMetadata(imageFile);
String[] results;
container.clear();
println(container);
for (Directory directory : metadata.getDirectories())
{
for (Tag tag : directory.getTags())
{
if(tag.getTagName() == "Keywords")
{
results = tag.getDescription().split(";");
for(int k=0; k<results.length; k++)
{
keywords.add(results[k]);
container.add(results[k]);
}
println(fileNames[i] + ", " + container);
imageTag.put(fileNames[i], container);
}
}
}
}
println(imageTag.entrySet());
}
打印出来:
[]
gardensbythebay.jpg, [gardens, gardens by the bay, supertree, singapore]
[]
mbs.jpg, [marina, bay, sands, ferris, wheel, skyline, singapore]
[]
supertree.jpg, [architecture, marina, gardens, bay, tower, supertree, singapore, gardens by the bay, plants, nature]
[]
uss.JPG, [universal, uss, rws, resort, world, sentosa, studios]
[mbs.jpg=[universal, uss, rws, resort, world, sentosa, studios],
uss.JPG=[universal, uss, rws, resort, world, sentosa, studios],
supertree.jpg=[universal, uss, rws, resort, world, sentosa, studios],
gardensbythebay.jpg=[universal, uss, rws, resort, world, sentosa, studios]]
答案 0 :(得分:3)
您不断重复使用相同的ArrayList。因此,当您清除它时,它也会清除您之前放置在地图中的内容。当你填充它时,它也会填充地图中已有的内容。因此,您最终会将所有键指向包含上次运行数据的同一列表。
您需要为每个条目创建一个新的ArrayList。
答案 1 :(得分:0)
这是一个错误:
if (tag.getTagName() == "Keywords")
永远不会成真。你应该使用:
if (tag.getTagName().equals("Keywords"))
但是你的主要问题是你重复使用 相同容器的每个条目。您应该为每个条目创建一个新条目,否则您将一遍又一遍地清除并添加到相同的地图值。
答案 2 :(得分:0)
在每次迭代中,您将清除容器,向其中添加元素,然后将容器添加到地图中。
地图仅存储参考。它不会复制列表。因此,您最终得到具有相同值的所有键:容器列表,包含最后一次迭代添加到它的内容。
每次迭代都应创建一个新列表,并将此列表添加到地图中。