2012-10-24 3 views
4

다음 복잡한 데이터 구조를 사용합니다.TreeMap에서 HashMap 가져 오기

departures = new TreeMap<String, Map<String, Set<MyObject>>>(); 
arrivals=new HashMap<String, Set<MyObject>>(); 
flights=new HashSet<MyObject>(); 

그런 다음 루프를 사용합니다 (다른 루프도 시도 함).

for(String dep: nizDep){ 
    for(String arr: nizArr){ 
     for(MyObject flight: _flights){ 
     if(flight.getFrom().equalsIgnoreCase(dep)&&flight.getTo().equalsIgnoreCase(arr)){ 
        flights.add(flight); 
       } 
       } 
       if(!flights.isEmpty()){ 
      arrivals.put(arr, flights); 
        flights.clear(); 
        } 
      } 
      if(!arrivals.isEmpty()){ 
      departures.put(dep, arrivals); 
      arrivals.clear(); 
      } 
    } 
    System.out.println(departures.size()); //result 14 
    System.out.println(departures.containsKey("Madrid")); //result true 
      arrivals=departures.get("Madrid"); 
    System.out.println(arrivals.size()); //result 0, arrivals is empty. WHY? 

내 질문이 복잡한 데이터 구조를 사용하는 방법과 출발에서 도착를 검색하는 방법은?

+0

왜이 '복잡한 구조'에 대한 수업을하지 않습니까? 만약 당신이했다면, 조금 더 이해할 수있게 만들 것입니다 ... – justderb

+0

이것은 많은 필자가 끝내야 할 많은 프로젝트의 일부이고 (예를 들어이 데이터 구조와 같이) 변경하지 않아야하는 코드이기 때문입니다. – exemplum

답변

1
 System.out.println(arrivals.size()); //result 0, arrivals is empty. WHY? 

당신이 departures.put(dep, arrivals); 후,이 원래 객체 (항공편 및 출발)를 지 웁니다 flights.clear();arrivals.put(arr, flights); 후 또는 arrivals.clear(); 호출하면 때문이다. for 루프 내 즉

 Map<String, Set<MyObject>> arrivals=new HashMap<String, Set<MyObject>>(); 
     Set<MyObject>(); flights=new HashSet<MyObject>(); 

당신의 초기화 문을 가져 오거나 아래와 같이 그 문을 교체하십시오 : 당신이 departures

   if(!flights.isEmpty()){ 
        Set<MyObject> newflights=new HashSet<MyObject>(); 
        newflights.addAll(flights); //copy elements to new set 
        arrivals.put(arr, newflights); 
        flights.clear(); 
       } 

동일한 기능을 수행 할 수 있습니다. 취득에서는 지금

:이 같은

 Set<String> arrivalKeys = departures.keySet(); 
     Interator<String> arrIter = arrivalKeys.iterator(); 
     while(arrIter.hasNext()){ 
     String arrKey = arrIter.next(); 
     Map<String, Set<MyObject>> arrivals = departures.get(arrKey); 
     //use your arrivals map object 
     } 

당신이 arrivals 예에서 flights를 검색 할 수있는 위와 같이 검색된 각각의 도착에 대한

: 당신이 도착 및 항공편 사이에 일대일 매핑을 유지하려는 경우

 Set<String> flightKeys = arrivals.keySet(); 
     Interator<String> flIter = flightKeys.iterator(); 
     while(flIter.hasNext()){ 
     String flKey = flIter.next(); 
     Set<MyObject> flights = arrivals.get(flKey); 
     //use your flights set object 
     } 
+0

반복자를 사용하는 대신 for 루프를 사용하지 않으므로 코드를 간결하고 간결하게 만들 수 있습니까? – Arham

0
arrivals=new HashMap<String, Set<MyObject>>(); 
departures = new TreeMap<String, Map<String, Set<MyObject>>>(); 
for(String dep: nizDep){ 
    for(String arr: nizArr){ 
     for(MyObject flight: _flights){ 
     if(flight.getFrom().equalsIgnoreCase(dep)&&flight.getTo().equalsIgnoreCase(arr)){ 
      flights=new HashSet<MyObject>(); 
      flights.add(flight);   
      arrivals.put(arr, flights);  
      departures.put(dep, arrivals); 
     } 
     } 
    } 
} 
System.out.println(departures.size()); //result 14 
if(departures.containsKey("Madrid")) { 
    arrivals=departures.get("Madrid"); 
    System.out.println(arrivals.size()); 
} 

는,이 코드는 작동합니다. 비행 세트를 유지하는 글로벌 구조를 유지하려면 다른 글로벌 gflights 객체를 만들어 모든 비행 객체를 그 객체에 집어 넣어야합니다.

관련 문제