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