#3 - operatory w akcji!
🏋️

#3 - operatory w akcji!

Tags
devChallenge 22
Published
December 5, 2022
Author
Jarosław Michalik
Dana jest klasa Coordinates i infixowa, extension, operator funkcja działająca na te Coordinates… Przypatrz się dobrze.
notion image
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() }