2016-04-01 2 views
2

ArrayListのデータ構造でJosephusの問題を解決しようとしています。タスクはListIteratorを使用することです。私は除去部分にこだわっています。listiteratorに関する懸念事項を削除します。java

1,2,3,4,5,6,7,8,9,10の兵士に次のような10人の兵士がいると言います。 私はすべての第3兵士を踏む必要があります。つまり、3つ、6つ、 9、など。

私が正常に3を削除することができていますが、それは7ではなく6を削除し、次回は、あなたが私のコードを見直し、私が間違っているのを教えてくださいすることができ:

private static int suicide (List<Integer> list, int step) { 

     ListIterator<Integer> itr = list.listIterator(); 

     while(itr.hasNext()&& list.size() != 1){ 

      if((itr.nextIndex()+1) % step == 0) { 
       System.out.println(itr.previousIndex()+1); 
       itr.next(); 
       itr.remove(); 
       itr.next(); 
      } 
      else { 
       itr.next(); 
      } 

      if(!itr.hasNext()){ 

       itr=list.listIterator(); 
      } 
     } 
     return 0; 
    } 
+0

私は、要素がインデックス内で移動し、ロジックに応じて要素7がインデックス '5'(論理的に6)にあり、したがって削除されるということを理解しています。私はそれを止める方法を理解したい。 – user4261932

答えて

0

一つの可能​​性はあなたのことですリストのコピーを作成し、そのコピー内の項目を削除しながら、「元の」項目を繰り返します(コピー内のイテレータ手順をスキップします)。

ListIterator itr = list.listIterator(); ListIterator itr2 = copy.listIterator();

while(itr.hasNext()&& list.size() != 1){ 

    if((itr.nextIndex()+1) % step == 0) { 
     System.out.println(itr.previousIndex()+1); 
     itr.next(); 
     itr2.next(); 
     itr2.remove(); 
     itr.next(); 
    } 
    else { 
      itr.next(); 
      itr2.next(); 
     } 
0

これを試してください。

int i = 3; 
int step = 1; 

while (list.size() > i) { 
    list.remove(i); 
    step++; 
    i = 3 * step - step + 1; 
} 
0

デザインロジックを元に戻す!

受け入れ要素のある新しいリストを作成することが、本当に最適なアプローチです。

削除は常に理解して維持するのが難しいです。

たとえば、自殺を希望する要素を持つ新しいリスト<>を返す必要があります。

あなたのコードは本当に単純になります:

List<Integer> cleanedList = new ArrayList<Integer>(); 
for(Integer soldier : list) { 
    if(solider%3!=0){ 
     cleanedList.add(soldier); 
    }  
} 
return cleanedList; 

ほとんどの時間を、私は新しいオブジェを作成するAPIを好みます。このルールを適用すると、コードは常により簡単なコードになります!パラメータを更新するのは良い動作ではありません。メソッドを2回呼び出すと、2つの異なる結果が得られます。

+0

しかし、一番最初に、彼はすべての3番目のエントリ(私はそれを理解した)を削除したいだけでなく、3で割ったエントリだけでなく、自分のコードは彼の "Let's say"のように動作します。 1. – Martin

+0

あなたは正しいですが、for(int i = 0)のインデックスを使ってこれを行うことができ、それは私があなたのリストのインデックスであるところで動作します –

関連する問題