Dana jest klasa Coordinates i infixowa, extension, operator funkcja działająca na te Coordinates… Przypatrz się dobrze.
data class Coordinates( val x: Double, val y: Double ) infix operator fun Coordinates.plus(c: Coordinates): Coordinates { return Coordinates(this.x+c.x, this.y+c.u) } val a = Coordinates(1.1, 1.0) val b = Coordinates(0.1, -1.2)
Na valach
a
i b
można wykonać kilka śmiesznych operacji. Na co pozwala nam funkcja infix operator fun Coordinates.plus
?Zaznacz wszystkie poprawne odpowiedzi i kliknij “submit / wyślij”.
Rozwiązanie #2
// funkcja powinna zwrócić listę tylko z unikalnymi elementami // input: listOf("1","2","3","3") // output: listOf("1","2","3") fun returnUnique(input: List<String>): List<String>{ return input.toSet().toList() }
Funkcja
toSet()
zamieni nam listę w Set<String>
i wykluczy duplikaty - w Secie mogą być tylko unikalne wartości. Potem na tym samym robimy toList()
i mamy listę z elementami setu – czyli unikalnymi. Bez zbędnych komplikacji :)Czy użycie funkcji
toSet()
zachowa kolejność elementów? Zobaczmy, co jest pod spodem tej funkcji:public fun <T> Iterable<T>.toSet(): Set<T> { if (this is Collection) { return when (size) { 0 -> emptySet() 1 -> setOf(if (this is List) this[0] else iterator().next()) else -> toCollection(LinkedHashSet<T>(mapCapacity(size))) } } return toCollection(LinkedHashSet<T>()).optimizeReadOnlySet() }
Funkcja
.toSet()
utworzy LinkedHashSet<T>
, który zachowuje “element iteration order”. Natomiast, gdybyśmy chcieli utworzyć zwykły HashSet<T>
, moglibyśmy stracić kolejność.Czy jest jeszcze inna metoda?
Tak! Biblioteka standardowa Kotlina zawiera funkcje obsługujące sporo “standardowych” przypadków. Extension function perfekcyjne do tego wyzwania, to
distinct
:public fun <T> Iterable<T>.distinct(): List<T> { return this.toMutableSet().toList() }
Z użyciem tej funkcji rozwiązanie naszego zadania może wyglądać następująco:
// input: listOf("1","2","3","3") // output: listOf("1","2","3") fun returnUnique(input: List<String>): List<String> { return input.distinct() }