【问题标题】:Populate Map<String, Map<String, Integer>> with values使用值填充 Map<String, Map<String, Integer>>
【发布时间】:2021-01-18 16:56:33
【问题描述】:

我需要用值填充Map&lt;String, Map&lt;String, Integer&gt;&gt;。我的代码如下:

// tags, <types, prices>
Map<String, Map<String, String>> outter = new HashMap<>();

List<String> tags = new ArrayList<String>();
tags.add("1tag");
tags.add("2tag");

List<String> types = new ArrayList<String>();
types.add("paper");
types.add("metal");

List<String> prices = new ArrayList<String>();
prices.add("1.20");
prices.add("2.20");

for (int t = 0; t < tags.size(); t++) {
    Map<String, String> inner = new HashMap<>();
    for (int tp = 0; tp < types.size(); tp++) {
        for (int p = 0; p < prices.size(); p++) {
            inner.put(types.get(tp), prices.get(p));
        }
    }
    outter.put(tags.get(t), inner);
}
System.out.println("filled outter:" + outter);

结果是:

filled outter:{2tag={paper=2.20, metal=2.20}, 1tag={paper=2.20, metal=2.20}}

我想要的正确结果是:

filled outter:{2tag={paper=1.20, paper=2.20, metal=1.20, metal=2.20}, 1tag={paper=1.20, paper=2.20, metal=1.20, metal=2.20}}

如何防止覆盖值并获得正确的结果? 帮助..

【问题讨论】:

  • 使用地图时不允许重复键
  • 与其保留一堆地图,不如使用一个对象(如MyItem)来保存所有这些相关信息。然后您可以使用集合或键控映射来存储这些对象以供以后参考

标签: java loops dictionary


【解决方案1】:

正如其他人所报告的那样,Java 的 Map 接口将每个键映射到单个值。如果您想为单个键分配多个值,您可以手动执行(映射到列表)。或者使用已有的库,例如 Guava's Multimap 用于您的内部地图。

这样你会得到类似的东西:

filled outter:{2tag={paper=[1.20, 2.20], metal=[1.20, 2.20]}, 1tag={paper=[1.20, 2.20], metal=[1.20, 2.20]}}

你可以将你的地图定义为:

Map<String, Multimap<String, String>> outter = new HashMap<>();

您有一个 Multimap here 的示例用法。

【讨论】:

    【解决方案2】:

    因为您不能在 Map 中设置两个具有相同名称的键。您应该在外部 Map 中创建一个 ArrayList 或类似的东西。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 2012-05-17
      相关资源
      最近更新 更多