将值插入HashMap无法正常运行

时间:2014-02-23 09:49:33

标签: java arraylist hashmap

我正在尝试将StringArrayList<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]]

3 个答案:

答案 0 :(得分:3)

您不断重复使用相同的ArrayList。因此,当您清除它时,它也会清除您之前放置在地图中的内容。当你填充它时,它也会填充地图中已有的内容。因此,您最终会将所有键指向包含上次运行数据的同一列表。

您需要为每个条目创建一个新的ArrayList。

答案 1 :(得分:0)

这是一个错误:

if (tag.getTagName() == "Keywords")

永远不会成真。你应该使用:

if (tag.getTagName().equals("Keywords"))

但是你的主要问题是你重复使用 相同容器的每个条目。您应该为每个条目创建一个新条目,否则您将一遍又一遍地清除并添加到相同的地图值。

答案 2 :(得分:0)

在每次迭代中,您将清除容器,向其中添加元素,然后将容器添加到地图中。

地图仅存储参考。它不会复制列表。因此,您最终得到具有相同值的所有键:容器列表,包含最后一次迭代添加到它的内容。

每次迭代都应创建一个新列表,并将此列表添加到地图中。