Kotlin - Yinelenen dizeleri diziden kaldırmanın deyimsel yolu?


Yanıtlar:


220

distinctUzantı işlevini kullanın :

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

Birinin öğeleri nasıl ayırt edeceğini belirlemesine izin veren distinctByişlev de vardır :

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

@ Mfulton26'nın önerdiği gibi toSet, toMutableSetve orijinal siparişin korunmasına ihtiyacınız yoksa toHashSet. Bu işlevler a Setyerine a üretir Listve bundan biraz daha verimli olmalıdır distinct.


Yararlı bulabilirsiniz:


5
Ayrıca kullanabilirsiniz toSetveya toMutableSetdaha az ek yükü olan distinctve sipariş önemli değilse kullanabilirsiniz toHashSet.
mfulton26

@ mfulton26, kesinlikle her zaman ek yükü yoktur. Örneğin, bir JPA varlık nesnesi tembel yüklenmiş alanlara sahip olabilir, bu nedenle koleksiyonunu kimliğe göre
ayırmak,

2
1): Anlıyorum @Buckstabue, biz iki farklı konular hakkında konuştuğunuz inanıyoruz to*Setdaha etkilidir (uzay ve zaman) distinct[By]o döndürdüğü için Setyerine doğrudan bir kullanarak Setdahili ve bir dönüştürerek List) dönüş değeri ve 2 gibi distinctByolduğunu distincttam nesne eşitliği karşılaştırmasından kaçınabileceğiniz için daha verimli olabilir. Her ikisi de geçerli noktalardır. Ben "kesinlikle her zaman havai yok" senin ifadesiyle koştum ve o yanıtlarken ve karşılaştırmakta olduğunu gözardı distinctile distinctBy(ve ile to*Set).
mfulton26

1
@ mfulton26, haklısın. Çoğunlukla, bazen List +
ayrıBy'yi kullanmanın Setten

1
Yazma sırasında Iterable.distinctaslında toMutableSet().toList()dahili olarak yapar . Bu yüzden performans konusunda endişelenme :-)
Luke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.