从TreeMap检索HashMap

问题描述:

我使用以下复杂的数据结构。从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

 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

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对象,并将每个航班对象放入其中。