2014-04-01 3 views
0

나는 iterating 후 Map of String and List<String>을 만들 수있는 객체 목록을 반복하려고합니다.개체의 목록을 반복하여 새지도를 만드는 방법은 무엇입니까?

다음은 dataCenter, hostName 및 hostId가있는 내 Machine 클래스입니다. 당신이 내 아래 코드를 볼 경우

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 

    } 
} 

, 나는 내가 6 컴퓨터 개체를 보유하고있는 machines의 목록이있다. 그런 다음 machines 개체를 반복하여 새지도를 만듭니다.

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

DC1 새로운지도의 핵심이며, hostA,hostB 그지도에 대한 문자열 값의 목록입니다 -

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); 

새로운 맵은 다음과 같이해야한다. 다른 사람들도 마찬가지입니다.

하지만 내 보유자지도에는 항상 데이터 센터의 모든 컴퓨터가 아닌 해당 데이터 센터의 최신 가치가 표시됩니다.

나는 어리석은 실수를하고 있습니다.

답변

4
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()); 
+0

아하 .. 감사합니다 루이 .. 어떻게 이것을 피할 수 있습니까? 이견있는 사람? – AKIWEB

+0

@AKIWEB :'add (..)'? – Brian

0

그게 전부 것, 이것은 당신이 그것을 달성 할 수있는 방법입니다

// 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()); 
    } 
관련 문제