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