具有重复键的多图实现

Multimap implementation with duplicate keys

我有一个函数,它 returns 数组列表如下

[java.lang.String=name, int=parameters, byte=paramOne, java.lang.String=format, byte=paramTwo]

并存储在如下变量中:List<Entry<String, String>> dataTypes

现在我想制作一个存储键值对的映射,就像这个列表一样。我试图制作单独的键和值列表,并且我正在尝试使用多重映射将其相互映射,但它不起作用。 (我知道 hashmaps 不能存储重复键,只会使用最后一个重复键及其各自的值,这就是我尝试使用多重映射的原因) 这是我正在尝试的代码:

        List<String> dataTypeValues = new ArrayList<>();
        List<String> dataTypeKeysList = new ArrayList<>();
        String keyString = null;
        String valueString = null;
                            
        for(Entry<String, String> dt : dataTypes) {
            dataTypeKeys.add(dt.getKey());
            keyString = dataTypeKeys.toString();
            
        }
        for(Entry<String, String> dt : dataTypes) {
            dataTypeValues.add(dt.getValue());
            valueString = dataTypeValues.toString();
        }
        Multimap<String, String> multiMap = ArrayListMultimap.create();         
        multiMap.put(keyString, valueString);
        System.out.println(multiMap);
        

这是我得到的输出:

{[java.lang.String, int, byte, java.lang.String, byte]=[[name, parameters, paramOne, format, paramTwo]]}    

这是我试图获得的输出:

{java.lang.String=[name], int=[parameters], byte=[paramOne,paramTwo], java.lang.String=[format]}

任何建议都会很有帮助。提前致谢!

编辑@User 提供的答案 - 赞成不要说谢谢@Louis Wasserman 完美运行。我接受了 @User 的回答 - 赞成票不要因为讨论而说谢谢。如果可以的话,我会接受这两个答案。 谢谢

take the last duplicate key

这就是 Collectors.toMap 的确切目的。

Map<String, list<String> multiMap = dataTypes.stream.collect(toMap(
  Map.Entry::getKey,
  e -> singletonList(e.getValue()),
  (v1, v2) -> {
    List<String> values = new ArrayList<>();
    values.addAll(v1);
    values.addAll(v2);

    return values;
  }
))

我不清楚你为什么要这样将条目放入多重映射中。至少,你想要的是

for (Entry<String, String> dt : dataTypes) {
  multiMap.put(dt.getKey(), dt.getValue());
}

然后,您可能想要打印 multimap.entries()。如果您关心条目的顺序,您可能需要 LinkedListMultimap.

你可以使用 groupingBy 我认为这对你来说是最理想的情况

Map<String, List<String>> res =
                dataTypes.stream().collect(Collectors.groupingBy(Map.Entry::getKey,
                             Collectors.mapping(Map.Entry::getValue, Collectors.toList())));