:各

2017-03-20 3 views
3

私は私の質問を開始する前に、私はいくつかの他のトピックを読んで行なったし、私は少し周りをしようとしたことに言及したいと思いますが、イム本当に混乱して気圧ので、私はちょうど尋ねるだろう考え出し。:各

だから、私は何をしたいことは、それぞれのセットを介して、その中にそれぞれに使用することをセットに要素を追加し、また、それらを反復処理です。 私は他の場所で、次がわかったソリューション:

for(Object obj : new HashSet<Object>(oldSet)) 

私はしかし、私はこれが最初では正しいアプローチであれば、本当にわからないイム一致したいのですが、最後の要素の一部が欠けておく、ということを試みました場所?

具体的には、これは私のコードがどのように見えるか、基本的である:

再び
for(Position pos : new HashSet<Position>(oldSet){ 
    for(Delta delta : deltas){ 
    if(board.getTokenAt(pos.plus(delta).equals(initial){ 
     hitList.add(pos.plus(delta); 
     oldSet.add(pos.plus(delta); 
    } 
    } 
oldSet.remove(pos); 
} 

、私はちょうど私のアプローチが間違っているかどうかを知りたいのですか、私のコードの他の場所でエラーがなければならないので、私何を見るかを知っている。 ありがとうございます!

+0

、通常、あなたが反復処理されているコレクションを変更しないでくださいイテレータを使用してみてください。 – ochi

+1

イテレータはこの動作をサポートしません。 BlockingQueueを使用してみても構いませんが、for構文では使用できません。 –

+0

イテレータは最初のセットを反復するだけですね。 また、セットのイテレーションを追加すると、同時変更例外afaikが発生しますか? –

答えて

1

それを反復しながら、あなたは本当に予期しない結果を持っていることはほぼ保証されること、データ構造に追加することはできません。

ただし、問題を解決するのに十分な簡単な方法があります。追加が必要な場合は、各項目を再帰的に処理し、別のListに追加してください。繰り返しの最後に、ListのすべてをSetメインに追加します。これにより、繰り返しの間に追加するという問題が回避され、新しく追加されたアイテムを処理できるようになります。

それはこのようなものになります。

List<Position> toAdd = new LinkedList<>(); 
for(Position pos : oldSet){ 
    for(Delta delta : deltas){ 
    addIfGoodAndRecurse(pos, delta, toAdd); 
    } 
} 

をそしてあなたはそれがあなたの条件を満たしているとも再帰的プロセスがアイテムを追加した場合の項目を追加するには、このヘルパーメソッドを使用することができます。注意、あなたがboardinitial、およびhitListをローカル変数に渡すには、メソッドシグネチャを変更する必要があります。私はその型やグローバル変数かフィールドなのか分からなかったので、実際にはその例では追加できませんでした。

private void addIfGoodAndRecurse(Position pos, Delta delta, List<Position> toAdd) { 
    Position toCheck = pos.plus(delta); 
    if(board.getTokenAt(toCheck.equals(initial))) { 
     hitList.add(toCheck); 
     toAdd.add(toCheck); 
     for (Delta recursionDelta : deltas) { 
      addIfGoodAndRecurse(toCheck, recursionDelta, toAdd); 
     } 
    } 
} 

私はあなたのコードを持っていないので、私はこれをテストすることはできません。アイデアはうまくいくはずですが、少し修正する必要があるかもしれません。

+0

私はまだそれを処理していますが、私はアイデアを得ていると思います。(ソリューションの気持ちを少し考えています。あなたのメソッドが完全にうまくいくので動作しているかどうかわかりません)問題が再び返事、ありがとう! –

0

あなたはイテレータていないリストの最後に追加し、指標とget()方法を使用して、それを反復処理し、場合は、反復しているリストに追加された新しい要素を反復処理することができます。また、今行っているようにセットを使用することもできますが、コレクションにユニークなアイテムだけを追加するようにしてください。あなたが感じる場合 - それは(あなたがコレクションに追加要素を保つため、無限ループに終わるIE)を「不要」な結果につながることができますよう

List<Position> list = new ArrayList<>(oldSet); 
for (int i = 0; i < list.length; ++i) { // NB list.length could be different each time 
    Position pos = list.get(i); 
    for(Delta delta : deltas){ 
    if(board.getTokenAt(pos.plus(delta).equals(initial){ 
     hitList.add(pos.plus(delta)); 
     if (oldSet.add(pos.plus(delta))) // Check if it already exists in the list 
      list.add(pos.plus(delta)); 
    } 
    } 
    oldSet.remove(pos); 
}