java如何将list<SomeType>转换为映射,以保留所有重复的键和值
我的清单如下:
List<Address> address;
在哪里
Address:
city
country
state
我想把它转换成下面这样的东西
Map <String,String> convertedMap=list.stream().collect
(Collectors.toMap(Address:getCity+Address:getCountry ,Address:getState));
我希望在生成的映射中保留所有重复的键和值,如下所示
(key=City1country1, value= state1) ,(key=City1country1, value=state2),(key=City1country1,value= state1) ;
# 1 楼答案
这种类型的东西是许多编码挑战的常见要求,下面是一种快速完成所需内容的方法。如果您有时间限制,我选择使用集合而不是列表将查找时间设置为O(1)而不是O(N):
输出:
注意:对于分隔符而不是空间,我认为你应该使用一个类似^ ^ {CD1>}的东西,这样就可以更容易地处理多个词的城市,例如纽约、旧金山等。# 2 楼答案
如注释中所述,映射不存储重复的键,因此必须使用
Map<String, List<String>>
而不是Map<String, String>
总之,您只需使用带有
mergeFunction
参数的Collectors.toMap
方法,就可以处理重复的键。每次出现相同的键时都会调用此操作。在本例中,我们只需将两个列表合并为一个。看看下面的代码(用JDK11编译),我相信它完全满足您的需要,并打印出预期的结果(当然使用List<String>
)# 3 楼答案
使用带有以下方法签名的toMap
BinaryOperator通知JVM如果遇到重复的密钥该怎么办。在您的情况下,如果它遇到重复的,则假定它将对它们进行跟踪
因此,s1+”,“+s2
因此,您的解决方案成为
输出
# 4 楼答案
你不能使用收集器。toMap,因为它需要唯一的键。您需要的是groupingBy,它返回每个键的收集值:
您可以使用各种技巧来组合城市和国家(如两个字符串的列表),但您确实应该创建一个键类,如上图所示。代码将更容易使用,特别是如果您(或其他开发人员)有理由在六个月后重新使用它的话
至于收集器方法:
Collectors.groupingBy(Location::new
等价于address -> new Location(address)
并在映射中创建每个键李>Collectors.mapping(Address::getState, Collectors.toSet())
意味着与特定键对应的每个地址都将在其上调用getState(),结果字符串将聚合在一个集合中以形成映射值李>就个人而言,我认为我会选择一个简单的for循环,而不是难以理解的流方法: