メインコンテンツまでスキップ

イテレータ

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

イテレータは、Iterable<T>インターフェース(SetListなど)の継承に対して、iterator()関数を呼び出すことで取得できます。

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

イテレータが最後の要素を通過すると、要素の取得には使用できなくなります。また、前の位置にリセットすることもできません。コレクションを再度イテレートするには、新しいイテレータを作成します。


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を使用すると、イテレータが暗黙的に取得されます。したがって、次のコードは上記の例と同等です。


fun main() {

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

}

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


fun main() {

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

}

Listイテレータ

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

逆方向のイテレーションは、hasPrevious()関数とprevious()関数によって実装されます。 さらに、ListIteratorは、nextIndex()関数とpreviousIndex()関数を使用して、要素のインデックスに関する情報を提供します。


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は最後の要素に到達した後でも使用できることを意味します。

Mutableイテレータ

可変コレクションをイテレートするために、MutableIteratorがあります。 これは、要素の削除関数remove()を使用してIteratorを拡張したものです。 したがって、コレクションをイテレートしながら要素を削除できます。


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()関数を使用して、リストをイテレートしながら要素を挿入および置換することもできます。


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]

}