イテレータ
コレクションの要素を走査するために、Kotlin標準ライブラリは、_イテレータ_という一般的に使用されるメカニズムをサポートしています。イテレータは、コレクションの基盤となる構造を公開することなく、要素に順次アクセスを提供するオブジェクトです。イテレータは、コレクションのすべての要素を一つずつ処理する必要がある場合(例えば、値を出力したり、同様の更新を行ったりする場合)に役立ちます。
イテレータは、Iterable<T>
インターフェースを継承するクラス(Set
やList
を含む)で、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
}
}
リストイテレータ
リストには、特殊なイテレータ実装である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
は最後の要素に到達した後でも使用できます。
可変イテレータ
可変コレクションをイテレートするために、MutableIterator
があります。これはIterator
を要素削除関数remove()
で拡張します。これにより、コレクションをイテレート中に要素を削除できます。
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]
}