1. 概要

この短いチュートリアルでは、Kotlinの配列から重複する値を削除する方法を学習します。

2. toMutableSet拡張機能

重複する値を持つ文字列の配列があり、そこから重複する値を削除する必要があるという基本的なシナリオから始めましょう。

ほとんどのプログラミング言語は、一意の値をコレクションとして格納するためのセットデータ構造を提供します。 Kotlinも例外ではないので、先に進み、 toMutableSet()関数を使用して配列をセットに変換しましょう。

val data = arrayOf("pie", "tie", "lie", "pie")
val uniqueData = data.toMutableSet()
assertEquals(3, uniqueData.size)
assertTrue(uniqueData.contains("pie"))
assertTrue(uniqueData.contains("tie"))
assertTrue(uniqueData.contains("lie"))

元の配列には4つの値がありましたが、結果の uniqueData セットには一意の値のみが含まれ、そのサイズは3であることがわかります。

3. 個別拡張機能

Kotlinは、個別の拡張関数も提供します。これを使用して、配列の個別の値をリストとして返すことができます。

val data = arrayOf("pie", "tie", "lie", "pie")
assertEquals(4, data.size)
val uniqueData = data.distinct()
assertEquals(3, uniqueData.size)
assertEquals("pie", uniqueData[0])
assertEquals("tie", uniqueData[1])
assertEquals("lie", uniqueData[2])

結果のリストの要素は、元の配列と同じ順序であることに注意してください。 重複する値のうち、最初の値のみが使用可能です。

4. distinctBy拡張機能

このセクションでは、エンティティオブジェクトを保持する配列から重複する値を削除する方法を学習します。

4.1. 従業員データクラス

従業員データクラスを定義することから始めましょう:

data class Employee(val id: String, val name: String)

2人の従業員が同じ名前を持つことはできますが、同じidを持つことはできないことに注意する必要があります。

4.2. 基準による明確な従業員

エンティティオブジェクトは複数の属性を持つことができます。 その結果、個別の値を取得するための複数の基準を持つことができます。

このようなシナリオのために、Kotlinは distinctBy拡張機能を提供します。これを使用して、重複する値を削除するための基準を指定できます。

id属性の値が重複している従業員の配列があるとします。

val emp1 = Employee("Jimmy", "1")
val emp2 = Employee("James", "2")
val emp3 = Employee("Jimmy", "3")
val employees = arrayOf(emp1, emp2, emp1, emp3)

配列内のemp3entityオブジェクトの値が重複していることがわかります。 次に、 distinctBy 関数を使用して、従業員に個別のidを取得しましょう。

val uniqueEmployees = employees.distinctBy { it.id }
assertEquals(3, uniqueEmployees.size)
assertEquals("Jimmy", uniqueEmployees.get(0).name)
assertEquals("1", uniqueEmployees.get(0).id)
assertEquals("James", uniqueEmployees.get(1).name)
assertEquals("2", uniqueEmployees.get(1).id)
assertEquals("Jimmy", uniqueEmployees.get(2).name)
assertEquals("3", uniqueEmployees.get(2).id)

予想どおり、結果のリストには3人の従業員しか含まれていません。

次に、一意の名前を持つ従業員のリストを取得することに関心があるシナリオを考えてみましょう。

val emp1 = Employee("John", "1")
val emp2 = Employee("John", "2")
val employees = arrayOf(emp1, emp2, emp1)

元の配列にemp1、の値が繰り返されているだけでなく、emp2エンティティにもemp1と同じ名前が付いていることがわかります。

一意の名前を持つ従業員を取得するには、name属性を使用してdistinctBy関数を使用します。

val employeesWithUniqueNames = employees.distinctBy { it.name }
assertEquals(1, employeesWithUniqueNames.size)
assertEquals("John", employeesWithUniqueNames.get(0).name)
assertEquals("1", employeesWithUniqueNames.get(0).id)

予想どおり、結果の従業員リストには1人の従業員がいます。

5. 結論

このチュートリアルでは、Kotlinで慣用的なコードを記述して、配列から重複する値とエンティティオブジェクトを削除することに焦点を当てました。

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