Kotlin zipToda alternativa
¿Tiene Kotlin function como zipAll en Scala?
En scala puedo hacer la sum de dos matrices con diferentes longitudes use la function zipAll.
- ¿Por qué Kotlin comstack más rápido que Scala?
- Companion se beneficia de la posibilidad de implementar interfaces
- Tipo de function con receptor en Scala
- Convierta la function de Scala a la function de Kotlin
- ¿Cómo funcionan las funciones de extensión de Kotlin?
Scala:
val arrA = Array(1,2,3) val arrB = Array(4, 5) arrA.zipAll(arrB, 0, 0).map(x => x._1 + x._2)
¿O cuál es la forma correcta de hacer esto en Kotlin?
- ¿Es posible mezclar Scala y Kotlin en el mismo module maven?
- Kotlin VS Scala: Implementar methods con parameters constructor primarios
- ¿Cómo hacer que los constructores seguros de Kotlin trabajen en Scala?
- Sistema local de administración de packages Java en Python PIP style?
- Forma equivalente de Scala de Rango a class personalizada
- Biblioteca Headless de una fuente para JVM y JavaScript
- Clase de Json a Kotlin Data
- Comstackción manual de JAR para Scala & Kotlin
No hay ningún análogo en construcción en Kotlin 1.0. Puede ser una buena idea agregarlo a stdlib. Siéntase libre de presentar un problema en el YouTrack
Hice una versión recursiva de queue rápida para divertirme. Aunque no es muy eficiente, debido a la list adjunta.
fun <T, U> List<T>.zipAll(that: List<U>, elem1: T, elem2: U): List<Pair<T, U>> { tailrec fun helper(first: List<T>, second: List<U>, acc: List<Pair<T, U>>): List<Pair<T, U>> { return when { first.isEmpty() && second.isEmpty() -> acc first.isEmpty() -> helper(first, second.drop(1), acc + listOf(elem1 to second.first())) second.isEmpty() -> helper(first.drop(1), second, acc + listOf(first.first() to elem2)) else -> helper(first.drop(1), second.drop(1), acc + listOf(first.first() to second.first())) } } return helper(this, that, emptyList()) }
Aquí está zipAll
para Kotlin:
fun <T1: Any, T2: Any> List<T1>.zipAll(other: List<T2>, emptyValue: T1, otherEmptyValue: T2): List<Pair<T1, T2>> { val i1 = this.iterator() val i2 = other.iterator() return generateSequence { if (i1.hasNext() || i2.hasNext()) { Pair(if (i1.hasNext()) i1.next() else emptyValue, if (i2.hasNext()) i2.next() else otherEmptyValue) } else { null } }.toList() }
Y una testing unitaria:
@Test fun sumTwoUnevenLists() { val x = listOf(1,2,3,4,5) val y = listOf(10,20,30) assertEquals(listOf(11,22,33,4,5), x.zipAll(y, 0, 0).map { it.first + it.second }) }
Y lo mismo podría aplicarse a las matrices, otros types de collections, secuencias, etc. Una versión de solo matriz sería más fácil ya que puede indexar en las matrices. La versión de matriz podría ser:
fun <T1: Any, T2: Any> Array<T1>.zipAll(other: Array<T2>, emptyValue: T1, otherEmptyValue: T2): List<Pair<T1, T2>> { val largest = this.size.coerceAtLeast(other.size) val result = arrayListOf<Pair<T1, T2>>() (0..this.size.coerceAtLeast(other.size)-1).forEach { i -> result.add(Pair(if (i < this.size) this[i] else emptyValue, if (i < other.size) other[i] else otherEmptyValue)) } return result.filterNotNull() }
Devuelve una List
porque la function de map
te convertirá en una list de todos modos.
- Hacer que el método / propiedad de extensión esté disponible globalmente
- Obtener reference de class de la function de nivel superior en kotlin