具有重复键的多图实现
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())));
我有一个函数,它 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())));