Kotlinのdistinct・toSetで重複を削除する方法
生徒
「Kotlinでリストの中に同じ値が何回も入っている場合、それを1つずつにまとめる方法はありますか?」
先生
「ありますよ。KotlinにはdistinctとtoSetという便利な関数があって、重複を簡単に削除できます。」
生徒
「名前が似ていますが、どう違うんですか?」
先生
「distinctは順番を保ちながら重複を削除し、toSetは集合型に変換することで重複を削除します。それぞれの特徴を詳しく見ていきましょう。」
1. distinctで重複を削除する方法:順番を維持してスッキリ
Kotlinのdistinct(ディスティンクト)は、リストの中から「すでに登場した値」を自動で見つけ出し、最初に出てきた順番を崩さずに重複だけを取り除いてくれる非常に賢い関数です。
プログラミングを始めたばかりの方でもイメージしやすいように、買い物リストを例に考えてみましょう。「りんご」を2回書いてしまっても、distinctを使えば、最初に書いた位置に「りんご」を残したまま、後から書いた余計な項目だけを消してくれます。
fun main() {
// 同じ果物が混ざっているリスト(重複あり)
val shoppingList = listOf("りんご", "バナナ", "りんご", "みかん", "バナナ")
// distinctを使って重複をカット
val uniqueList = shoppingList.distinct()
println("元のリスト: $shoppingList")
println("整理後のリスト: $uniqueList")
}
元のリスト: [りんご, バナナ, りんご, みかん, バナナ]
整理後のリスト: [りんご, バナナ, みかん]
このコードのポイントは、2回目に出てきた「りんご」や「バナナ」が消えても、「りんご」が一番最初にあるという順番は変わっていない点です。リストの並び順に意味があるデータを扱うときは、このdistinctを使うのが最も安全で確実な方法といえます。
内部的な仕組みとしては、元のリストを先頭から一つずつ確認し、新しいリストにまだ入っていないものだけを追加していく処理を行っています。難しい計算を書かなくても、たった一行でデータをクリーンにできるのがKotlinの魅力ですね。
2. toSetメソッドを使って手軽に重複データを消す方法
Kotlinでリスト(データの並び)から重複した値を一気に取り除きたいとき、最もシンプルで便利な方法の一つがtoSet()という命令を使うことです。
「Set(セット)」とは、数学でいう「集合」のようなもので、「同じ値を2つ以上持つことができない」という特別なルールを持っています。そのため、リストを一度Setに変換するだけで、魔法のように重複が消えてスッキリとしたデータになります。
fun main() {
// 同じ数字が混ざっているリストを用意します
val numbers = listOf(1, 2, 2, 3, 3, 3, 4)
// toSetを使って重複をカット!
val uniqueSet = numbers.toSet()
// 結果を表示してみましょう
println(uniqueSet)
}
[1, 2, 3, 4]
この方法のポイントは、初心者の方でも直感的に書けるほど短いコードで済む点です。ただし、注意点が1つあります。toSet()を使った後のデータは「List」ではなく「Set」という別の型に変わります。
Set型は、重複を許さない代わりに「何番目のデータを取り出す」といった操作がListほど得意ではありません。また、基本的には元の順番を保持してくれますが、プログラムの意図として「順番が何より大切」という場合は、前述した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件にまとめています。条件付きでの重複削除に便利です。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
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]
このように、無駄な重複を避けることで効率的な処理が可能になります。
【未経験OK】Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験する60分
「プログラミングを始めたい」を形にする。最新言語Kotlinで楽しむ、ものづくりの第一歩。
本講座は、プログラミング経験が全くない方のためのエントリー講座です。「コードを書くってどういうこと?」という基本から、世界中で使われている最新言語Kotlin(コトリン)を使って、実際にプログラムを動かすまでを体験します。難しい理屈よりも、まずは「自分の手で動かす楽しさ」を最短距離で実感していただきます。
具体的な体験内容と環境
【つくるもの】
簡単な言葉を入力すると自動で返答してくれる「対話型ミニプログラム」や、計算を自動化する「便利ツール」をゼロから作成します。黒い画面に自分の書いた文字が表示される瞬間は、最高の感動体験です。
【開発環境】
プロのエンジニアが実際に使っている開発ツールIntelliJ IDEA(インテリジェイ)をインストールします。ボタン一つで日本語化し、初心者でも迷わず操作できる「魔法の設定」を一緒に行います。
この60分で得られる3つの体験
プロと同じ道具を揃えることで、明日から一人でもプログラミングを続けられる環境が整います。
「変数」や「型」といった難しい言葉も、身近な例え話で解説。モヤモヤをゼロにします。
Kotlinは英語に近くて読みやすいのが特徴。自分でコードを読んで、間違いを見つけるコツも伝授します。
※本講座は、パソコン操作が不安な方でも安心して受講いただける完全マンツーマンです。あなたのペースに合わせて、一つずつ丁寧に進めていきます。
Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験