【问题标题】:How to iterate a list of an object to make a new Map from it?如何迭代对象列表以从中创建新地图?
【发布时间】:2014-04-01 20:15:52
【问题描述】:

我正在尝试迭代一个对象列表,以便在迭代后我可以从中创建一个Map of String and List<String>

下面是我的 Machine 类,它有 dataCenter、hostName 和 hostId。

public class Machine { 

    private String dataCenter;
    private String hostName;
    private String hostId;

    // getters here

    public Machine(String dataCenter, String hostName, String hostId) {
        // some code here

    }
}

如果您看到我下面的代码,我有一个 machines 列表,其中有 6 个机器对象。然后迭代 machines 对象并从中制作一个新的 Map。

    Map<String, List<String>> holder = new LinkedHashMap<String, List<String>>();

    List<Machine> machines = new ArrayList<Machine>();

    Machine machine1 = new Machine("DC1", "machineA", "hostA");
    Machine machine2 = new Machine("DC1", "machineB", "hostB");
    Machine machine3 = new Machine("DC2", "machineC", "hostC");
    Machine machine4 = new Machine("DC2", "machineD", "hostD");
    Machine machine5 = new Machine("DC3", "machineE", "hostE");
    Machine machine6 = new Machine("DC3", "machineF", "hostF");

    machines.add(machine1);
    machines.add(machine2);
    machines.add(machine3);
    machines.add(machine4);
    machines.add(machine5);
    machines.add(machine6);

    // some other code here

    // iterate machines object
    for (Machine machine : machines) {
        LinkedList<String> ppMachine = new LinkedList<String>();

        // below code doesn't work as it shows only last machine for that Datacenter
        ppMachine.add(machine.getHostId());
        holder.put(machine.getDatacenter(), ppMachine);
    }

    System.out.println(holder);

新地图应该是这样的——

DC1 - hostA,hostB
DC2 - hostC,hostD
DC3 - hostE,hostF

这里DC1 是新映射的键,hostA,hostB 是该映射的字符串值列表。其他人也一样。

但不知何故,在我的持有者地图中,我总是看到该数据中心的机器的最新价值,而不是该数据中心的所有机器。

不知何故,我犯了一个非常愚蠢的错误。

【问题讨论】:

    标签: java list loops map


    【解决方案1】:
        LinkedList<String> ppMachine = new LinkedList<String>();
    
        // below code doesn't work as it shows only last machine for that Datacenter
        ppMachine.add(machine.getHostId());
        holder.put(machine.getDatacenter(), ppMachine);
    

    您正在替换与machine.getColo() 关联的整个列表,而不是添加新条目。

    可能最简单的解决方法是

        LinkedList<String> dynMachine = holder.get(machine.getDatacenter());
        if (dynMachine == null) {
          dynMachine = new LinkedList<String>();
          holder.put(machine.getDatacenter(), dynMachine);
        }
        dynMachine.add(machine.getDatacenter());
    

    【讨论】:

    • Aaahh.. 谢谢 Louis.. 我该如何避免这种情况?有什么想法吗?
    【解决方案2】:

    那是因为您在每次迭代中都创建了一个新列表,这就是您可以实现它的方法:

        // iterate machines object
        for (Machine machine : machines) {
            LinkedList<String> dynMachine = holder.get(machine.getColo());
            if (null == dynMachine) {
               dynMachine = new LinkedList<String>();
               holder.put(machine.getColo(), dynMachine);
            }
            dynMachine.add(machine.getHostId());
        }
    

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 1970-01-01
      • 2017-02-10
      • 2018-03-19
      • 1970-01-01
      • 2013-09-03
      • 2021-03-02
      • 2013-07-16
      • 2018-10-19
      相关资源
      最近更新 更多