Kotlin-配列から重複する文字列を削除する慣用的な方法?


回答:


197

distinct拡張機能を使用します

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]

アイテムを区別する方法を指定できるdistinctBy関数もあります:

val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]

@ mfulton26提案し、あなたも使用することができtoSettoMutableSetあなたが保存される元の順序を必要としない場合は、とtoHashSet。これらの関数はのSet代わりにを生成し、Listよりも少し効率的ですdistinct


あなたは役に立つかもしれません:


5
toSetまたはtoMutableSetを使用することもできますが、オーバーヘッドが少なくdistinct、順序が重要でない場合は使用できますtoHashSet
mfulton26

@ mfulton26、確かにそれは常にオーバーヘッドがあるわけではありません。たとえば、JPAエンティティオブジェクトは遅延読み込みフィールドを持つことができるため、完全な比較を実行するよりもIDでコレクションを区別する方が効率的です
Buckstabue

2
@Buckstabueなるほど、2つの異なる問題について話していると思います。1)内部で使用するのではなく直接を返し、戻り値としてaに変換するため、to*Setより効率的(空間と時間)であり、2)は完全なオブジェクトの等価比較を回避できるため、単純な場合よりも効率的です。どちらも有効なポイントです。私は「確かに常にオーバーヘッドがあるわけではない」というあなたの発言を実行しましたが、私はそれに返信していて、あなたが(ではなく)と比較しているのを見過ごしていました。distinct[By]SetSetListdistinctBydistinctdistinctdistinctByto*Set
mfulton26

1
@ mfulton26、あなたは正しいです。Setを呼び出すよりもコストが高くなる可能性があるequals / hashCodeを集中的に使用するため、Setと
ListByBy

1
執筆時点では、Iterable.distinct実際にはtoMutableSet().toList()内部で行われます。パフォーマンスについては気にしないでください:-)
ルーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.