4

次の複雑なデータ構造を使用します。

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?

私の質問は、この複雑なデータ構造をどのように使用し、出発から到着を取得する方法ですか?

4

2 に答える 2

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

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
      }

たとえばflightsから取得するためにできることと同じarrivals

上記のように取得された各到着について:

      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
      }
于 2012-10-24T21:21:44.267 に答える
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());
}

到着とフライトの間で 1 対 1 のマッピングを維持したい場合は、このコードが機能します。一連のフライトを維持するグローバル構造を維持したい場合は、別のグローバル gflights オブジェクトを作成し、すべてのフライト オブジェクトをその中に配置する必要があります。

于 2012-10-24T21:46:01.577 に答える