2012-10-24 81 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? 

BECAUSE當你調用flights.clear();arrivals.put(arr, flights);arrivals.clear();departures.put(dep, arrivals);後,這將清除您的原始對象(航班和進港航班)。請把你的初始化語句即

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

或如下取代聲明:

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

你一樣可以用departures做。

現在對於檢索:

 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

不會循環而不是使用迭代器使代碼更簡潔和簡單? – 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對象,並將每個航班對象放入其中。