1

クラス内のマップを読み取るためにパブリックイテレータをクラスに配置し、このイテレータを他のクラスに実装しようとすると、問題が発生します。または他の言葉で、

クラスAがあります。クラスAには、このマップを反復するパブリックイテレータを介してアクセスするプライベートHashMapが含まれています。

クラスBもあります。このイテレータをクラスBで実行して、クラスAの内容を読み取ろうとしています。

これは少し回り道のように見えるかもしれませんが(むしろ、多くの回り道)、私の割り当てでは、クラスAのデータシステムを他のクラスに隠すように指定し、パブリックイテレーターを使用してデータにアクセスすることを提案しました。クラスBのメソッドがどのように見えるかの例があります。これは、私ができる限り実行したものです。

しかし、それを機能させることはできません。

これが私が持っているコードのモックアップです。コンパイルしてみましたが、実際のコードとまったく同じように動作します。

// this is class A

public class Giant {

private Map<Item, Integer> myMap = new HashMap<Item, Integer>();

// add a bunch of items to the map, check if they worked fine

public Iterator<Map.Entry<Item, Integer>> giantIterator = myMap.entrySet().iterator();

}

// and this is in class B

public void receive(Giant mouse){
    System.out.println("I've started!");
        Iterator<Map.Entry<Item, Integer>> foo = mouse.giantIterator;

        while (foo.hasNext()) {
            Map.Entry<Item, Integer> entry = foo.next();
            System.out.println("I'm working!");
        }
}

また、いずれかのクラスのオブジェクトを作成してからreceiveメソッドを実行するテストクラスもあります。

「始めました!」というメッセージが表示されます。しかし、「私は働いています!」ではありません。

同時に、どちらかのクラスの2つのイテレータにaを出力させるtoString場合、toStringsは同じです。

イテレータはいくつかの異なるメソッドにあり、それぞれでわずかに異なるものに使用されるため、クラスBで実行することになっているアクションをクラスAに単純に移動することもできません。

私は少し困惑しています。構文に何かが欠けていますか?何か間違ったものをインポートしていますか?これがどのように機能するかを完全に台無しにしただけですか?これは完全に不可能ですか?

4

3 に答える 3

3

次のような関数を使用してイテレータを公開してみてください。

public class Giant {
    private Map<Item, Integer> myMap = new HashMap<Item, Integer>();
    public Iterator<Map.Entry<Item, Integer>> getGiantIterator() {
         return myMap.entrySet().iterator();
    }
}

そしてクラスBの変更:

    Iterator<Map.Entry<Item, Integer>> foo = mouse.giantIterator;

Iterator<Map.Entry<Item, Integer>> foo = mouse.getGiantIterator();

そうすれば、イテレータは必要になるまで作成されません。

あなたがそれをコーディングした方法で、イテレータはマップがまだ空の間に作成されます。これがあなたの問題の根源かもしれないと私は思う。

于 2013-02-28T06:45:34.723 に答える
2

Aが構築されるとイテレータが構築され、その時点でマップは空です。

最新バージョンを返すメソッドgetIterator()を作成します。

于 2013-02-28T06:47:21.027 に答える
0

イテレータが1つあり、さまざまなクラスがそれにアクセスできるようにする場合は、その変数を「静的」に設定します。

于 2013-02-28T06:49:30.400 に答える