1. 概要

このチュートリアルでは、Kotlinでのリストの操作について説明します。

2. Kotlinのリスト

リストは、重複する値を含む可能性のある要素の一般的な順序付きコレクションです。 また、Kotlinの Listは、Collectionインターフェイスを拡張するインターフェイスです。

このインターフェースのすべてのメソッドは、リストへの読み取り専用アクセスをサポートします。 リストインターフェイスがどのように宣言されているかを見てみましょう。

public interface List<out E> : Collection<E>

さらに、 Kotlinには、リストの要素を変更するためのMutableListインターフェイスがあります MutableList インターフェースは、MutableCollectionインターフェースを拡張します。 このインターフェイス内のメソッドを使用すると、リストに要素を追加したり、リストから要素を削除したりできます。

次に、可変リストインターフェイスがどのように宣言されているかを見てみましょう。

public interface MutableList<E> : List<E>, MutableCollection<E>

ListインターフェースとMutableListインターフェースの両方に、Kotlinでリストを操作するのに役立つメソッドがあります。

3. リストを作成する

listOf()メソッドを使用して、Kotlinで読み取り専用リストを作成できます。

val countries = listOf("Germany", "India", "Japan", "Brazil", "Australia")

また、 mutableListOf()メソッドを使用して、Kotlinで可変リストを作成できます。

val cities = mutableListOf("Berlin", "Calcutta", "Seoul", "Sao Paulo", "Sydney")

4. リストを反復処理する

リストを反復処理することで、リストの要素にアクセスできます。 それを行うにはいくつかの方法があります。

4.1. ループ

さまざまなタイプのforループを使用して、Kotlinのリストを反復処理できます。

まず、forループが要素ごとにリストをトラバースします。 サイクルごとに、変数countryはリスト内の次の要素を指します。

for (country in countries) {
    country.length
    // ...
}

リストのサイズを使用して要素をトラバースする代替のforループがあります。

for (i in 0 until countries.size) {
    countries[i].length
    // ...
}

また、反復を実行できるメソッドもいくつかあります。

たとえば、 forEach()メソッドは、述語関数をパラメーターとして受け取り、リスト内の各要素に対してアクションを実行します。

countries.forEach { it ->
    it.length
    // ...
}

また、 forEachIndexed()メソッドは、要素に順次インデックスを提供するとともに、各要素に対してアクションを実行します。 これは、要素のインデックスと要素自体を含む述語関数をパラメーターとして受け取ります。

countries.forEachIndexed { i, e ->
    e.length
    // ...
}

4.2. イテレータのリスト

listIterator()メソッドを使用して、リストを順方向と逆方向の両方で反復処理できます。

イテレータは、 listIterator(index:Int)メソッドを使用して、指定されたインデックスから始まるリストを反復処理するためにも使用できます。 さらに、リストイテレータはメソッドnextIndex() およびpreviousIndex():を使用して要素インデックスに関する情報を提供できます。

fun iterateUsingListIterator() {
    val iterator = countries.listIterator()
    while (iterator.hasNext()) {
        val country = iterator.next()
        // ...
    }

    while (iterator.hasPrevious()) {
        val country = iterator.previousIndex();
        // ...
    }
}

4.3. 可変リストイテレータ

MutableCollectionインターフェースによって提供されるiterator()メソッドを使用できます。 このイテレータでは、リストを反復処理するだけでなく、 remove()メソッドを使用して要素を削除することもできます。

fun iterateUsingIterator() {
    val iterator = cities.iterator()
    iterator.next()
    iterator.remove()
    // ...
}

MutableListインターフェースによって提供されるlistIterator()メソッドを使用することもできます。 このイテレータを使用すると、リストを反復処理しながら要素を追加、置換、および削除できます

fun iterateUsingMutableListIterator() {
    val iterator = cities.listIterator(1)
    iterator.next()
    iterator.add("London")
    iterator.next()
    iterator.set("Milan")
    // ...
}

5. リスト内の要素を取得する

get()メソッドを使用して、リスト内の指定された要素を取得できます。 さらに、インデックス演算子[]を使用して要素にアクセスする配列スタイルを使用することもできます。

インデックス演算子[]は、get() メソッドよりもノイズが少なく、より便利です

val element = countries[2]
val element = countries.get(3)

first() メソッドとlast() メソッドをそれぞれ使用して、リストの最初と最後の要素を取得できます。 さらに、これら2つの方法を使用して、特定の述語に一致する要素のコレクションを検索することもできます。

述語に一致する要素がない場合は、 firstOrNull()および lastOrNull()メソッドを使用して、例外のスローを回避できます。

次の例を見て、最初と最後の要素を取得しましょう。

countries.first()
countries.last()
countries.first { it.length > 7 }
countries.last { it.startsWith("J") }
countries.firstOrNull { it.length > 8 }

6. リストの一部を取得する

subList()メソッドを使用して、リストの一部を取得できます。 メソッドのパラメーターは、 fromIndex (包括的)と toIndex (排他的)の間のリストの指定範囲を定義するために使用されます。

subList()メソッドは元のリストのビューを返し、それとともに変更されます。したがって、元のリストの構造が変更されると、ビューの動作が未定義になります。

サブリストを作成する例を見てみましょう。

val subList = countries.subList(1, 4)

assertEquals(3, subList.size)

さらに、 Collection インターフェイスは、リストの一部を取得するための別のメソッドを提供します。

slave()メソッドを使用して、インデックスに基づいてリストの一部を取得できます。 すべてのインデックスが含まれています。 subList()とは異なり、このメソッドは、要素のサブセットを使用して新しいリストを作成します。

slave()メソッドがどのように機能するかを見てみましょう。

val sliceListUsingIndices = countries.slice(1..4)

assertEquals(4, sliceListUsingIndices.size)
val sliceListUsingCollection = countries.slice(listOf(1, 4))

assertEquals(2, sliceListUsingCollection.size)

7. リスト内の要素を数える

count()メソッドまたは size プロパティを使用して、リスト内の要素の数を見つけることができます。 count()メソッドを使用すると、述語関数をパラメーターとして提供することもできます。その後、指定された述語に一致する要素の数を返します。

リスト内の要素を数える方法を見てみましょう。

val count = countries.count()
val count = countries.count { it.length > 5 }
val size = countries.size

8. リストに操作を書き込む

add()および addAll()メソッドを使用して、可変リストに要素を追加できます。

また、追加の引数として要素挿入の位置を指定することにより、リスト内の特定の位置に要素を追加できます。

cities.add("Barcelona")
cities.add(3, "London")
cities.addAll(listOf("Singapore", "Moscow"))
cities.addAll(2, listOf("Prague", "Amsterdam"))

remove()および removeAll()メソッドを使用して、可変リストから要素を削除できます。 さらに、 removeAt()メソッドを使用して、リスト内の指定された位置から要素を削除することもできます。

リストから要素を削除する例を見てみましょう。

cities.remove("Seoul")
cities.removeAt(1)

set()メソッドを使用して、リスト内の指定された位置にある要素を置き換えることができます。 さらに、インデックス演算子[]を使用して要素を置き換えることもできます。

fill()メソッドを使用して、リスト内のすべての要素を指定された値に置き換えることができます。

set()、 []、および fill を使用して、リストを変更してみましょう。

cities.set(3, "Prague")
cities[4] = "Moscow"
cities.fill("Barcelona")

9. リスト内の操作の並べ替え

sort()メソッドと sortDescending()メソッドを使用して、Kotlinのリストをそれぞれ昇順と降順で並べ替えることができます。

val sortCitiesAscending = cities.sort()
val sortCitiesDescending = cities.sortDescending()

これらのメソッドは、要素の自然な順序を使用し、インプレースで並べ替えます。 したがって、コレクションは変更可能なリストである必要があります

並べ替え後にリストを返したい場合は、 sorted()および sortedDescending()メソッドを使用できます。

val sortedCountriesAscending = countries.sorted()
val sortedCountriesDescending = countries.sortedDescending()

sortBy()メソッドとsortByDescending()メソッドを使用して、特定のオブジェクトの特定のプロパティに基づいてリストを並べ替えることができます。メソッドは要素の自然な順序を使用し、並べ替えるため、コレクションは変更可能なリストである必要があります。 -場所。 並べ替え後にリストを返したい場合は、 sortedBy()メソッドと sortedByDescending()メソッドを使用できます。

sortWith()および sortedWith()を使用して、コンパレータオブジェクトを引数として使用してリストを並べ替えることができます。

Kotlinでリストを操作する際の並べ替え操作の詳細については、Kotlinでの並べ替えガイドの記事を参照してください。

10. リスト内の要素を確認する

contains()メソッドまたは演算子のを使用して、リスト内の指定された要素を確認できます。 後者はより流暢であり、Kotlinで推奨されます。

containsAll()メソッドを使用して、リスト内の複数の要素を確認できます。 contains()メソッドとcontainsAll()メソッドの両方がブール値を返します。

contains()および containsAll()を使用してリストをテストしてみましょう。

assertTrue(countries.contains("Germany"))

assertFalse("Spain" in countries)

assertTrue(cities.containsAll(listOf("Calcutta", "Sao Paulo", "Sydney")))

11. 結論

このチュートリアルでは、Kotlinでリストを操作するためのさまざまな操作を見ました。 ListインターフェイスとMutableListインターフェイスはどちらも、リスト内の要素を処理するためのいくつかのメソッドを提供します。

いつものように、これらの例のコードはGitHubから入手できます。

Kotlinの機能の詳細については、Kotlinチュートリアルのいずれかをご覧ください。