Kotlinのdistinct・toSetで重複を削除する方法
先生と生徒の会話形式で理解しよう
生徒
「Kotlinでリストの中に同じ値が何回も入っている場合、それを1つずつにまとめる方法はありますか?」
先生
「ありますよ。KotlinにはdistinctとtoSetという便利な関数があって、重複を簡単に削除できます。」
生徒
「名前が似ていますが、どう違うんですか?」
先生
「distinctは順番を保ちながら重複を削除し、toSetは集合型に変換することで重複を削除します。それぞれの特徴を詳しく見ていきましょう。」
1. distinctで重複を削除する方法
distinctは、リストやシーケンスから重複した要素を取り除き、最初に出てきた順番を保ったまま新しいリストを作ります。
fun main() {
val numbers = listOf(1, 2, 2, 3, 3, 3, 4)
val uniqueNumbers = numbers.distinct()
println(uniqueNumbers)
}
[1, 2, 3, 4]
このように、同じ数字は最初の1つだけ残り、順番は元のままです。
2. toSetで重複を削除する方法
toSetはリストをSet型に変換します。Setは重複を許さないため、自動的に重複が削除されます。
fun main() {
val numbers = listOf(1, 2, 2, 3, 3, 3, 4)
val uniqueSet = numbers.toSet()
println(uniqueSet)
}
[1, 2, 3, 4]
結果はdistinctと似ていますが、戻り値がSet型になる点に注意が必要です。Setは順番を保証しない場合もあるので、順序が重要なときはdistinctを使いましょう。
3. distinctとtoSetの使い分け
- distinct:順序を保ちながら重複を削除したいとき
- toSet:順序を気にせず、集合として扱いたいとき
例えば、ユーザーが登録したタグの一覧を表示する場合は順序が重要なのでdistinct、データベースに保存する場合は順序不要でtoSetを使うことが多いです。
4. distinctByで特定条件に基づく重複削除
KotlinにはdistinctByという派生メソッドもあり、特定の条件やキーに基づいて重複を削除できます。
data class User(val name: String, val age: Int)
fun main() {
val users = listOf(
User("田中", 20),
User("田中", 25),
User("佐藤", 20)
)
val uniqueByName = users.distinctBy { it.name }
println(uniqueByName)
}
[User(name=田中, age=20), User(name=佐藤, age=20)]
この例では名前が同じユーザーを1件にまとめています。条件付きでの重複削除に便利です。
5. 実用例:メールアドレスの重複排除
メールマーケティングや通知機能などで、重複したアドレスへの送信を避けたい場合に使えます。
fun main() {
val emails = listOf(
"test@example.com",
"user@example.com",
"test@example.com"
)
val uniqueEmails = emails.distinct()
println(uniqueEmails)
}
[test@example.com, user@example.com]
このように、無駄な重複を避けることで効率的な処理が可能になります。