从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?
我的问题是如何利用这个复杂的数据结构,以及如何从出发抵港取回?
答
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对象,并将每个航班对象放入其中。
你为什么不为这个“复杂结构”做类?如果你这样做,它会使它更容易理解... – justderb
,因为这是一个很大的项目的一部分,我需要完成一些代码,我不应该改变(例如这个数据结构)。 – exemplum