具有重复密钥的多映射实现



我有一个函数,它以以下方式返回数组列表

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

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

现在,我想制作一个映射,像下面的列表一样存储键值对。我曾尝试制作单独的键和值列表,并尝试使用多映射将其相互映射,但这并不奏效。(我知道hashmaps不能存储重复的密钥,只会取最后一个重复的密钥及其相应的值,这就是我尝试使用multimaps的原因(这是我正在尝试的代码:

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-Upvote提供的答案不会说谢谢和@Louis Wasserman非常有效。由于讨论,我接受了@User-Upvote不要说谢谢的回答。如果可以的话,我会接受这两个答案。谢谢

您可以使用groupingBy,我认为这是的理想情况

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

获取最后一个重复密钥

这就是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

最新更新