0

リストのサイズが分かっていて、その中の 5 つおきの要素だけを調べたいと想像してください。以下のように、でそれを行うと思いArrayListます:

List<Item> l = new ArrayList<Item>();
for (int i = 0; i < l.size(); ) {
    Item item = l.get(i);
    i += 5;
}

i私が呼び出すたびにリストのすべての要素を間接的に繰り返しますが、l.get(i)これはばかげています。5 つおきの要素にのみアクセスする方法はありますか? たぶんLinkedListListIteratorその目的でを使用する方法の例を教えてください。

4

2 に答える 2

3

l.get(i) を呼び出すたびに、 i までのリストのすべての要素を間接的に反復します

いいえ、そうではありません。get(i)inArrayListは O(1) 操作であり、バッキング配列からアイテムを直接フェッチします - 反復は必要ありません。ArrayList の javadocを参照してください。

size、isEmpty、get、set、iterator、および listIterator 操作は一定時間で実行されます。


逆に、 a を使用すると、すべての要素を反復処理するため、LinkedList javadoc でLinkedList説明されているように効率が低下します。

リストにインデックスを付ける操作は、指定されたインデックスに近い方からリストをトラバースします。

于 2012-07-24T10:44:38.763 に答える
1
it will indirectly iterate through every element of the list up to i each time I call l.get(i)

周知のように、ArrayList はその実装で配列に支えられているため、配列と同じように動作します。したがって、いつでも実行get(i)すると、そのインデックスに直接移動してデータをフェッチします。

Maybe LinkedList? Could you please give me an example on how to use the ListIterator for that purpose?

コンピューター サイエンスのデータ構造を調べたことがある場合は、LinkedList がポインターを介して実装されていることを知っています。すべての要素が次の要素を指すことを意味します。したがって、この場合、要素をジャンプして 5 番目に到達することはできません。最初に移動する必要があり、2 番目に移動すると 3 番目に移動します。

どのデータ構造を使用するかを決定する必要があります。

于 2012-07-24T11:52:03.833 に答える