我有一个List<POJO>
,其中每个POJO都有一个字段“ ID”,其值是“ IP_ADDRESS”。我想将此列表汇总到Map<ID,Set<IP_ADDRESS>>
。
public Map<String, Set<String>> listToMapConverters(List<NormalizedSyslogMessage> listOfNormalizedSyslogMessages) {
Map<String, Set<String>> partyToHostNameMapping = new HashMap<>();
for (NormalizedSyslogMessage message : listOfNormalizedSyslogMessages) {
Set<String> hostIpSet = new TreeSet<>();
hostIpSet.add(message.getIpaddress().toString());
partyToHostNameMapping.put(message.getPartyID().toString(),
hostIpSet);
}
}
我要为每个ID设置一组单独的ipaddress,在这里我要聚合特定ID的IpAddress。
由于项目限制,我不想使用任何第三方库。任何帮助表示赞赏。
答案 0 :(得分:2)
您需要检查映射TreeSet
中是否已经存在适当的输入值,并在其中添加partyToHostnameMapping
,而不是在for循环的每次迭代中创建新的IP_ADDRESS
如果存在,则改为一个。
答案 1 :(得分:0)
您可能要检查此ID密钥是否已经存在。
如果没有,请按已添加的位置添加它。
如果确实如此,只需将IP地址添加到现有的Set
中。
for (NormalizedSyslogMessage message : listOfNormalizedSyslogMessages) {
Set<String> existingSet = partyToHostNameMapping.get(message.getPartyID().toString());
if(existingSet == null){
Set<String> hostIpSet = new TreeSet<>();
hostIpSet.add(message.getIpaddress().toString());
partyToHostNameMapping.put(message.getPartyID().toString(),
hostIpSet);
}
else{
existingSet.add(message.getIpaddress().toString());
}
}
答案 2 :(得分:0)
您可以使用一些Java 8功能,例如流和lambda:
Map<ID, Set<IP_ADDRESS>> someMap=
List.stream().collect(groupingBy(POJO::getId, mapping(POJO::getIP_ADDRESS, toSet()));
答案 3 :(得分:-1)
如果Set
中的Map
已经存在,则需要重用。
public Map<String, Set<String>> listToMapConverters(List<NormalizedSyslogMessage> listOfNormalizedSyslogMessages) {
Map<String, Set<String>> partyToHostNameMapping = new HashMap<>();
for (NormalizedSyslogMessage message : listOfNormalizedSyslogMessages) {
// create Set only if not present already
Set<String> hostIpSet = partyToHostNameMapping.computeIfAbsent(message.getPartyID().toString(), k -> new TreeSet<>());
hostIpSet.add(message.getIpaddress().toString());
}
}