Kotlinで学ぶArrayListの使い方12選

Kotlinプログラマが書いたArrayListのコード例Kotlin
この記事は約17分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、KotlinのArrayListの使い方を完璧に理解し、効果的に応用することができるようになります。

Kotlinは現代のアプリ開発に欠かせない言語となっています。

特にArrayListは、データを効果的に管理・操作する上での重要な要素となっています。

この記事では、そのArrayListの使い方を、初心者の方でも理解できるように詳しく解説していきます。

●KotlinとArrayListとは?

Kotlinは、Javaに似た構文を持ちつつ、より簡潔で使いやすく、そして強力な言語として知られています。

Androidアプリ開発をはじめとする多くの場面で利用されており、その人気は日々高まっています。

○Kotlinの基本的な紹介

Kotlinは、2011年にJetBrains社によって公開されたプログラミング言語です。

Javaとの互換性を持ちながら、より簡潔で安全なコードを書くことができる点が多くの開発者から支持されています。

また、Null安全な言語仕様や、拡張関数といった特徴があり、効率的なコーディングを実現します。

○ArrayListの特徴と主な用途

ArrayListは、動的な配列としての役割を果たすコレクションクラスです。

固定サイズの配列とは異なり、要素の追加や削除によってサイズが自動的に変わる特徴があります。

これにより、データの管理が非常に柔軟になります。

主な用途としては、順序を保持したままのデータの保存や、頻繁にデータの追加・削除が行われる場面での使用が考えられます。

●ArrayListの作り方

ArrayListはKotlinで非常に頻繁に使用されるコレクションの1つです。

動的なサイズ変更が可能で、順序を保持したままのデータの保存が行えるため、多くのプログラマーに支持されています。

ここでは、その基本的な作成方法を2つの項目に分けて紹介します。

○基本的な初期化方法

KotlinでArrayListを作成する基本的な方法は、次のようにarrayListOf関数を使用することです。

この方法では、空のArrayListを生成します。

val list = arrayListOf<String>()

このコードではString型の空のArrayListを作成しています。

<String>の部分を変更することで、IntやDoubleなど、他の型のArrayListも作成することができます。

実行すると、listという名前の空のArrayListが生成されるという結果になります。

このArrayListには、後から要素を追加したり、削除することが可能です。

○初期値を持ったArrayListの作成

初期値を持ったArrayListを作成する場合、次のようにarrayListOf関数に初期値を渡すことで実現できます。

val listWithValues = arrayListOf("A", "B", "C")

このコードでは、”A”, “B”, “C”という3つの文字列を持ったArrayListを作成しています。

このコードを実行すると、listWithValuesという名前のArrayListが生成され、そのArrayListには”A”, “B”, “C”の3つの文字列が順に格納されるという結果となります。

●ArrayListの詳細な使い方

ArrayListは非常に多機能であり、多くの操作がサポートされています。

ここでは、KotlinのArrayListでよく使われる操作方法を、サンプルコードとともに詳しく解説します。

○サンプルコード1:要素の追加

ArrayListに要素を追加するには、addメソッドを使用します。

下記のコードは、listという名前のArrayListに"D"という文字列を追加する例です。

val list = arrayListOf("A", "B", "C")
list.add("D")
// listは["A", "B", "C", "D"]となります。

このコードを使用することで、元々のlist"D"という文字列が追加され、最終的には["A", "B", "C", "D"]という内容のArrayListになります。

○サンプルコード2:要素の取得

ArrayListの特定の位置にある要素を取得するには、インデックス番号を使ってアクセスします。

下記のコードは、listの2番目の要素を取得する例です。

val list = arrayListOf("A", "B", "C", "D")
val element = list[2]
// elementは"C"となります。

このコードでは、listの3番目の要素(インデックスは0から開始するため2番目)が"C"であるため、elementには"C"が代入されます。

○サンプルコード3:要素の削除

ArrayListから要素を削除する場合、いくつかの方法が存在します。

特定の要素を削除する方法や、指定したインデックスの要素を削除する方法など、シチュエーションに応じて選べる方法があります。

1つ目の方法として、removeメソッドを使用して特定の要素を直接削除することができます。

val list = arrayListOf("A", "B", "C", "D")
list.remove("B")
// listの中身は["A", "C", "D"]となります。

このコードでは、”B”という要素がlistから削除されるため、結果的に["A", "C", "D"]という内容のArrayListが得られます。

2つ目の方法として、removeAtメソッドを使い、インデックスを指定して要素を削除することができます。

val list = arrayListOf("A", "B", "C", "D")
list.removeAt(2)
// listの中身は["A", "B", "D"]となります。

このコードを実行すると、listの3番目の要素(インデックスは0から開始するため2番目)が削除されるため、結果として["A", "B", "D"]という内容のArrayListが得られます。

○サンプルコード4:ArrayListのサイズ取得

ArrayListに格納されている要素の数、つまりサイズを取得するには、sizeプロパティを使用します。

val list = arrayListOf("A", "B", "C", "D")
val size = list.size
// sizeは4となります。

このコードにより、listのサイズは4であるという情報を得ることができます。

sizeプロパティは非常に便利で、ArrayListの要素の数を知るための基本的な方法として頻繁に使用されます。

○サンプルコード5:ArrayListのクリア

ArrayListの全ての要素を一度に削除し、空のリストとしたい場合は、clearメソッドを使用します。

val list = arrayListOf("A", "B", "C", "D")
list.clear()
// listは空のArrayListとなります。

このコードを実行すると、list内の全ての要素が削除され、空のArrayListが得られます。

大量のデータを一度にクリアしたい場合や、リストの初期化を行いたい際にこのメソッドは非常に便利です。

●ArrayListの応用例

ArrayListは単なるデータの保存だけでなく、さまざまな応用的な操作も可能です。

ここでは、ArrayListをより高度に活用するためのサンプルコードとその詳細な解説を行います。

○サンプルコード6:ArrayListを使ったループ処理

ArrayListの要素を1つずつ取り出し、それを利用して何らかの処理を行いたい場合、forループやforEachメソッドを使用することができます。

val list = arrayListOf("A", "B", "C", "D")
for(item in list) {
    println(item)
}

このコードでは、list内の各要素を取り出し、それを表示しています。

実行すると、次のように各要素が順番に表示されます。

A
B
C
D

○サンプルコード7:ArrayListのソート

ArrayListの要素をソートする場合、sortメソッドを使用することで簡単に実現できます。

数値や文字列など、基本的な型の要素の場合、このメソッドを使用するだけで昇順にソートされます。

val numberList = arrayListOf(30, 10, 20, 40)
numberList.sort()
// numberListの中身は[10, 20, 30, 40]となります。

このコードでは、numberListの要素が昇順にソートされ、結果として[10, 20, 30, 40]という内容のArrayListが得られます。

逆順にソートする場合は、sortDescendingメソッドを使用します。

val numberList = arrayListOf(30, 10, 20, 40)
numberList.sortDescending()
// numberListの中身は[40, 30, 20, 10]となります。

このコードにより、numberListの要素が逆順にソートされるため、[40, 30, 20, 10]という内容のArrayListが得られます。

○サンプルコード8:ArrayListを配列に変換

KotlinでArrayListを配列に変換する方法は非常にシンプルです。

たとえば、String型のArrayListをString型の配列に変換する場合、toTypedArrayメソッドを使用します。

このメソッドを利用することで、ArrayListの要素がそのままの順序で配列に変換されます。

val stringList = arrayListOf("apple", "banana", "cherry")
val stringArray: Array<String> = stringList.toTypedArray()
// stringArrayの内容は["apple", "banana", "cherry"]

このコードでは、stringListという名前のArrayListに3つの文字列が格納されています。

toTypedArrayメソッドを使うことで、これらの要素がそのままの順序でstringArrayという配列に格納されます。

○サンプルコード9:配列をArrayListに変換

逆に、配列をArrayListに変換する場合も、Kotlinでは簡単に実現できます。

その際には、asListメソッドとArrayListのコンストラクタを組み合わせて使用します。

val intArray = arrayOf(1, 2, 3, 4)
val intList: ArrayList<Int> = ArrayList(intArray.asList())
// intListの内容は[1, 2, 3, 4]

このコードで、intArrayという整数型の配列の要素が、intListという名前のArrayListに変換されて格納されます。

asListメソッドを使って配列をリストに変換し、その後、ArrayListのコンストラクタを使用してArrayListに変換しています。

○サンプルコード10:フィルタリングとマッピング

KotlinのArrayListには多くの強力な関数が組み込まれており、その中でfiltermapは特に頻繁に使用される関数です。

まず、filter関数を使うと、特定の条件を満たす要素だけを取り出すことができます。

例えば、整数のArrayListから偶数だけを取り出す場合は次のようになります。

val numbers = arrayListOf(1, 2, 3, 4, 5)
val evenNumbers = numbers.filter { it % 2 == 0 }
// evenNumbersの内容は[2, 4]

このコードでは、numbersというArrayListから偶数のみを取り出して、新しいリストevenNumbersを作成しています。

次に、map関数を紹介します。

この関数を使うと、リストの各要素を別の形に変換することができます。

例えば、上の整数のArrayListの各要素を2倍にしたい場合は次のように記述します。

val doubledNumbers = numbers.map { it * 2 }
// doubledNumbersの内容は[2, 4, 6, 8, 10]

このコードでは、numbersの各要素を2倍して、doubledNumbersという新しいリストを作成しています。

filtermapのような関数を駆使することで、データの加工や抽出を効率的に行うことが可能です。

初心者の方も、上記のサンプルコードを参考にして、実際に自身のプロジェクトでの応用を試みてみてください。

○サンプルコード11:2つのArrayListの結合

2つのArrayListを結合する場合、plus演算子やaddAll関数を使用します。

まず、plus演算子を使用して2つのArrayListを結合する方法を見てみましょう。

val list1 = arrayListOf("apple", "banana")
val list2 = arrayListOf("cherry", "date", "fig")
val combinedList = list1 + list2
// combinedListの内容は["apple", "banana", "cherry", "date", "fig"]

このコードでは、list1list2という2つのArrayListを結合し、combinedListという新しいArrayListを作成しています。

一方、addAll関数を使うと、一方のArrayListに別のArrayListの要素を追加することができます。

list1.addAll(list2)
// list1の内容は["apple", "banana", "cherry", "date", "fig"]

この方法では、list1list2の要素が追加される形になります。

2つのArrayListを結合する方法は、データのマージや一つのリストにまとめる際に非常に便利です。

初心者の方も、上記の方法を使って、リストの結合の処理を実際に試してみることで、理解を深めることができるでしょう。

○サンプルコード12:ArrayListの逆順ソート

ArrayListの要素を逆順にソートする場合、reverse関数を使用します。

この関数を使うと、リストの要素の順序を逆にすることができます。

val fruits = arrayListOf("apple", "cherry", "banana")
fruits.reverse()
// fruitsの内容は["banana", "cherry", "apple"]

このコードを実行すると、fruitsの要素が逆順になります。

逆順ソートは、データの表示順序を変更したい場合や、特定の条件下でのソートが必要な場合など、様々なシチュエーションで使用されます。

上記のコードを参考に、自身のプロジェクトでの応用を試してみてください。

●ArrayListの注意点と対処法

ArrayListはKotlinのプログラミングにおいて非常に便利なデータ構造の一つですが、注意しなければならないポイントも存在します。

ここでは、主な注意点とその対処法について解説いたします。

○同期化に関する注意点

ArrayListはスレッドセーフではありません。

これは、複数のスレッドから同時にアクセスした場合、データの不整合や予期しないエラーが発生する可能性があることを意味します。

例えば、複数のスレッドからArrayListに要素を追加する場合、次のようなコードが考えられます。

val list = arrayListOf<Int>()
// 以下は想像上のマルチスレッド処理
thread1 {
    list.add(1)
}
thread2 {
    list.add(2)
}

このような場合、予期しない結果やエラーが発生する可能性が高まります。

対処法としては、Collections.synchronizedList()を使用してスレッドセーフなリストを作成する方法があります。

val list = Collections.synchronizedList(arrayListOf<Int>())
// これでlistは同期化され、スレッドセーフとなります

このように、複数のスレッドからArrayListを使用する際は、必ず同期化を心掛けてください。

○メモリリークの可能性とその回避方法

ArrayListの大きな要素を長時間保持することや、不要な要素を適切に削除しないと、メモリリークが発生する恐れがあります。

メモリリークはアプリケーションのパフォーマンス低下やクラッシュの原因となる可能性があるため、注意が必要です。

対処法としては、不要になった要素は速やかにremoveメソッドで削除する、あるいはclearメソッドでリスト全体をクリアすると良いでしょう。

val items = arrayListOf("A", "B", "C")
items.remove("B")
// itemsの内容は["A", "C"]

また、特定の条件を満たす要素を一括で削除する場合は、removeIf関数も役立ちます。

val numbers = arrayListOf(1, 2, 3, 4, 5)
numbers.removeIf { it % 2 == 0 }
// numbersの内容は[1, 3, 5]

このコードでは偶数の要素をリストから一括で削除しています。

メモリリークを避けるためには、ArrayListのライフサイクルを意識し、不要な要素やリスト自体を適切に管理することが重要です。

●ArrayListのカスタマイズ方法

KotlinでのArrayListの使用は、そのままでも多様な操作が可能ですが、更に柔軟性を持たせるためのカスタマイズ方法を学ぶことで、更に実用的なコードを書くことができます。

ここでは、ArrayListをカスタマイズする2つの方法について詳しく解説します。

○カスタムクラスの使用

まず、ArrayListに格納するデータ型をカスタムクラスとして定義する方法について考えます。

例として、Personというクラスを定義し、そのオブジェクトをArrayListで管理するシナリオを考えます。

// Personクラスの定義
data class Person(val name: String, val age: Int)

// Personオブジェクトを格納するArrayListの作成
val persons = arrayListOf(
    Person("田中", 25),
    Person("佐藤", 30),
    Person("鈴木", 22)
)

このコードでは、Personクラスを定義して、名前と年齢を持つオブジェクトを作り、それをArrayListで管理しています。

○拡張関数の利用

Kotlinでは、既存のクラスに新しい機能を追加することができる拡張関数という機能があります。

これを利用して、ArrayListに新しい操作を追加することができます。

例として、ArrayListの全要素の平均年齢を取得する拡張関数を考えてみます。

// ArrayListの拡張関数としてaverageAgeを追加
fun ArrayList<Person>.averageAge(): Double {
    var totalAge = 0.0
    for (person in this) {
        totalAge += person.age
    }
    return totalAge / this.size
}

// 使い方
val avgAge = persons.averageAge()
println("平均年齢は${avgAge}歳です。")

このコードを実行すると、平均年齢は25.666666666666668歳です。という結果が得られます。

拡張関数を利用することで、ArrayListに特有の操作を追加することができ、コードの再利用性や可読性が向上します。

まとめ

KotlinでのArrayListの使い方を学ぶことで、データの動的な管理や操作が効率的に行えるようになります。

基本的な操作から、応用例、カスタマイズ方法までを網羅的に学ぶことで、初心者でも簡単に理解し、実際のプログラム作成に役立てることができます。

ArrayListは、その柔軟性と拡張性から、多くの場面で使用されるデータ構造の一つです。

特に、要素の追加や削除が頻繁に行われる場面や、要素数が予め不明な場合に非常に役立ちます。

また、Kotlin独自の特徴である拡張関数を利用することで、ArrayListに特化した操作を追加することも可能です。

これにより、更に使い勝手の良いコードを書くことができます。

今回学んだ内容を元に、実際のアプリケーション開発などの場面でArrayListを活用し、効率的なコードを書くことを目指しましょう。

KotlinのArrayListは、その強力な機能と柔軟性で、プログラミングの幅を大きく広げることができるツールとなります。