将POJO列表转换为Map <string,set <string >>

时间:2018-08-14 06:58:34

标签: java collections

我有一个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。

由于项目限制,我不想使用任何第三方库。任何帮助表示赞赏。

4 个答案:

答案 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());
    }
}