2012-05-07 11 views
1

2次元のハッシュマップでどのように反復処理を行うことができますか?私は次のことを行うオブジェクトTrueStringMap2Dを作成しています。マップ2D、つまり2つのキーと1つの値を意味します。2次元のマップ内のイテレータ

ここで実装されているイテレーターは機能しません。TrueStringMap2DでIteratorメソッドを再定義する方法を知りませんでした:S(イテレーター()機能で削除する必要がある場合) 誰でも手助けできますか? ありがとうございます!

+0

は誰でもしてください助けることができますか? – ZelelB

+1

[私はSOがそれをすべて読んでいるとは思っていません](http://meta.stackexchange.com/a/129787/175248)あなたの質問の範囲に合うようにあなたのコードを書き換えることができれば、大きな利点となるでしょう。 – Makoto

+0

無駄なマップが含まれているマップを反復処理するイテレータを再定義したいと思います。 (私が投稿したクラスEntryで) – ZelelB

答えて

3

私は質問を答えが似ているものに再解釈し、うまくいけばその質問に対する答えはあなたにとって有益です。

ここで私がお答えします質問です:

を私はMap<String, Map<String, String>>内のすべての値を反復処理する反復子を書くにはどうすればよいですか?

これ、私はそれを解決する方法を次のとおりです。

class TwoDimIterator implements Iterator<String> { 

    Iterator<Map<String, String>> outerIter; 
    Iterator<String> innerIter = Collections.<String>emptyList().iterator(); 

    public TwoDimIterator(Map<String, Map<String, String>> twoDimMap) { 
     outerIter = twoDimMap.values().iterator(); 
     advanceInner(); 
    } 

    @Override 
    public boolean hasNext() { 
     return innerIter.hasNext(); 
    } 

    @Override 
    public String next() { 
     String toReturn = innerIter.next(); 
     advanceInner(); 
     return toReturn; 
    } 

    private void advanceInner() { 
     while (!innerIter.hasNext()) { 
      if (!outerIter.hasNext()) { 
       innerIter = Collections.<String>emptyList().iterator(); 
       return; 
      } 
      innerIter = outerIter.next().values().iterator(); 
     } 
    } 

    @Override 
    public void remove() { 
     throw new UnsupportedOperationException(); 
    } 
} 

テストコード:

class Test { 

    public static void main(String[] args) { 

     // Create a map 
     Map<String, Map<String, String>> twoDimMap = 
       new HashMap<String, Map<String, String>>(); 

     // Fill it 
     Map<String, String> innerA = new HashMap<String, String>(); 
     innerA.put("1", "A1"); 
     innerA.put("2", "A2"); 

     Map<String, String> innerB = new HashMap<String, String>(); 
     innerB.put("1", "B1"); 
     innerB.put("2", "B2"); 

     twoDimMap.put("A", innerA); 
     twoDimMap.put("B", innerB); 

     // Create an iterator for the values: 
     Iterator<String> twoDimIter = new TwoDimIterator(twoDimMap); 
     while (twoDimIter.hasNext()) 
      System.out.println(twoDimIter.next()); 

    } 
} 

出力:

A2 
A1 
B2 
B1 
+0

お返事ありがとうございます!しかし、その宿題と教授は、私たちに外部クラスを使うべきではないことを教えてくれました。イテレータメソッドを再定義するだけです。あなたはそれを私のTrueStringMap2Dに適応できますか?それはちょうどメソッド..それは私がイテレータメソッドのためだけに使用するクラスEntryを含む)と私のTrueStringMap2D ..インターフェイスを投稿した理由です。私はコードを理解できますか?その最後の方法は、実装する必要があります..ありがとう!! – ZelelB

+0

宿題の場合は、残りのステップを解決して解決すると思います。 :) – aioobe

+0

しかし、それは各エントリの3つの値(key1、key2、value)を返しません...それは値を返します..:S – ZelelB