LinkedListがあり、これを何度も繰り返す必要があります。動的に作成されるワークフローの一連のページを追跡するために使用しています。これは私が期待するようには動作しません。この例を考えると:
LinkedList<String> navigationCases;
navigationCases.add("page1");
navigationCases.add("page2");
navigationCases.add("page3");
navigationCases.add("page4");
ListIterator navigationItr = navigationCases.listIterator();
navigationItr.next(); // Returns page1
navigationItr.next(); // Returns page2
navigationItr.previous(); //Returns page2 again
navigationItr.next(); //Returns page2 again
リストを間違って作成しているか、Iteratorを間違って使用しているのではないかと思いましたが、ドキュメントを読んだ後、これは仕様によるもののようです。
ListIteratorには現在の要素がありません。そのカーソル位置は常に、previous()の呼び出しによって返される要素とnext()の呼び出しによって返される要素の間にあります。
と:
(次へ)リスト内の次の要素を返します。このメソッドは、リストを反復処理するために繰り返し呼び出される場合もあれば、previousへの呼び出しと混合して前後に移動する場合もあります。(nextとpreviousを交互に呼び出すと、同じ要素が繰り返し返されることに注意してください。)
したがって、これを読んだ後、私のコードがそのように動作している理由は明らかです。なぜこのように機能するのか理解できません。この実装に対応するために、removeでさえ後方に曲がっているようです。
remove()メソッドとset(Object)メソッドは、カーソル位置に関して定義されていないことに注意してください。これらは、next()またはprevious()の呼び出しによって返された最後の要素を操作するように定義されています。
概念的には、LinkedListは私のワークフローのケースをかなりうまくモデル化しているように見えましたが、このように動作するIteratorを使用することはできません。ここで何かが足りないのでしょうか、それとも、ケースのリストを維持してそれらをナビゲートする独自のクラスを作成する必要がありますか?