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.

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?

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.

  • Herencia genérica de Kotlin
  • Usar varios lenguajes JVM en el mismo proyecto
  • Comstackción manual de JAR para Scala & Kotlin
  • @uncheckedVariance en Kotlin?
  • Forma equivalente de Scala de Rango a class personalizada
  • Kotlin: llaves de varias expresiones (o declaraciones)
  • Clase de Json a Kotlin Data
  • Biblioteca Headless de una fuente para JVM y JavaScript
  • Genéricos reificados en Scala 2.10
  • ¿Cómo hacer que los constructores seguros de Kotlin trabajen en Scala?
  • Sistema local de administración de packages Java en Python PIP style?