Skip to content

イテレーター

コレクションの要素を走査するために、Kotlin標準ライブラリは一般的によく使われるメカニズムである「イテレーター(iterator)」をサポートしています。これは、コレクションの背後にある構造を公開せずに、要素に順次アクセスできるようにするオブジェクトです。 イテレーターは、値の出力や値に対する同様の更新を行うなど、コレクションのすべての要素を1つずつ処理する必要がある場合に便利です。

イテレーターは、iterator() 関数を呼び出すことで、SetList を含む Iterable<T> インターフェースの継承クラスから取得できます。

一度イテレーターを取得すると、それはコレクションの最初の要素を指します。next() 関数を呼び出すとその要素を返し、次の要素が存在する場合はイテレーターの位置をその次の要素へ移動させます。

イテレーターが最後の要素を通過すると、それ以上要素を取得するために使用することはできず、また以前のどの位置にもリセットすることはできません。コレクションを再度反復処理するには、新しいイテレーターを作成してください。

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    val numbersIterator = numbers.iterator()
    while (numbersIterator.hasNext()) {
        println(numbersIterator.next())
        // one
        // two
        // three
        // four
    }
}

Iterable なコレクションを走査する別の方法は、よく知られた for ループです。コレクションで for を使用すると、暗黙的にイテレーターが取得されます。したがって、以下のコードは上記の例と同等です。

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    for (item in numbers) {
        println(item)
        // one
        // two
        // three
        // four
    }
}

最後に、コレクションを自動的に反復処理し、各要素に対して指定されたコードを実行できる便利な forEach() 関数があります。同じ例は以下のようになります。

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    numbers.forEach {
        println(it)
        // one
        // two
        // three
        // four
    }
}

リストイテレーター

リストには、特別なイテレーターの実装である ListIterator があります。これは、順方向と逆方向の両方の反復処理をサポートしています。

逆方向の反復は、hasPrevious()previous() 関数によって実装されています。 さらに、ListIteratornextIndex() および previousIndex() 関数を使用して、要素のインデックスに関する情報を提供します。

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    val listIterator = numbers.listIterator()
    while (listIterator.hasNext()) listIterator.next()
    println("Iterating backwards:")
    // Iterating backwards:
    while (listIterator.hasPrevious()) {
        print("Index: ${listIterator.previousIndex()}")
        println(", value: ${listIterator.previous()}")
        // Index: 3, value: four
        // Index: 2, value: three
        // Index: 1, value: two
        // Index: 0, value: one
    }
}

両方向への反復が可能であるため、ListIterator は最後の要素に到達した後でも引き続き使用できます。

ミュータブルイテレーター

ミュータブル(可変)なコレクションを反復処理するために、Iterator を拡張して要素削除関数 remove() を追加した MutableIterator があります。これにより、反復処理中にコレクションから要素を削除できます。

kotlin

fun main() {
    val numbers = mutableListOf("one", "two", "three", "four") 
    val mutableIterator = numbers.iterator()
    
    mutableIterator.next()
    mutableIterator.remove()    
    println("After removal: $numbers")
    // After removal: [two, three, four]
}

要素の削除に加えて、MutableListIterator は、add() および set() 関数を使用することで、リストの反復処理中に要素の挿入や置換を行うこともできます。

kotlin

fun main() {
    val numbers = mutableListOf("one", "four", "four") 
    val mutableListIterator = numbers.listIterator()
    
    mutableListIterator.next()
    mutableListIterator.add("two")
    println(numbers)
    // [one, two, four, four]
    mutableListIterator.next()
    mutableListIterator.set("three")   
    println(numbers)
    // [one, two, three, four]
}