• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

212
Vistas
Aplane la matriz de matrices a una matriz en Kotlin

Tengo el siguiente código Java 11 (los contenidos de arr1 y arr2 no son tan simples en mi código y tengo más de 2 matrices, pero el concepto es el mismo):

 String[] arr1 = new String[] {"a","b"}; String[] arr2 = new String[] {"c", "d"}; var req = Stream.of(arr1, arr2).flatMap(Stream::of).toArray(String[]::new);

El propósito de este código es tomar todos los valores en varias matrices de cadenas y producir una única matriz de cadenas. Debe ser una matriz, no una colección, debido a que una API fuera de mi control acepta una matriz de cadenas más adelante en el código.

En este ejemplo simple, la matriz resultante debe tener los siguientes elementos en este orden: { "a", "b", "c", "d" } .

¿Cuál es la forma canónica de aplanar una matriz de matrices de 1 profundidad en una sola matriz en Kotlin?

La razón principal por la que estoy en un bucle aquí es que el convertidor de IntelliJ Java a Kotlin hizo un trabajo bastante malo al convertir este código, dejándolo con múltiples errores de sintaxis extraños en la salida de Kotlin. El resto de mi código que no usa cosas como referencias a métodos se convirtió mucho más limpiamente a Kotlin.

about 3 years ago · Santiago Trujillo
5 Respuestas
Responde la pregunta

0

.flatten() debería hacer el trabajo.

 val arr1 = arrayOf("a", "b") val arr2 = arrayOf("c", "d") arrayOf(arr1, arr2).flatten()

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/flatten.html

about 3 years ago · Santiago Trujillo Denunciar

0

No sé sobre canónico, pero quizás el equivalente más simple es:

 val arr1 = arrayOf("a", "b") val arr2 = arrayOf("c", "d") val req = arrayOf(arr1, arr2).flatten().toTypedArray()

Eso crea un Array<String> con los cuatro valores que desea.

Aquí no estamos transformando los valores, simplemente volviéndolos a empaquetar, por lo que flatten() es más simple que flatMap , que es más común.

(Normalmente es mejor usar listas y otras colecciones; la biblioteca estándar tiene un soporte mucho mejor para ellas, además de evitar problemas relacionados con los genéricos y el borrado de tipos, pero tener que interoperar con una API antigua o mal diseñada, como se especifica en esta pregunta , es uno de los casos de esquina para los que aún puede necesitar arreglos, junto con varargs e implementación de colección de bajo nivel).

about 3 years ago · Santiago Trujillo Denunciar

0

Lo más fácil en Kotlin sería:

 val arr1 = arrayOf("a", "b") val arr2 = arrayOf("c", "d") val result = arrayOf(arr1, arr2) .flatten() .toTypedArray()

flatten() crea una List y toTypedArray() la convierte en una matriz. Esto podría considerarse una pérdida de ciclos de CPU, pero por otro lado, no veo una manera de crear una matriz directamente a partir de una secuencia/secuencia diferida, porque no sabemos el tamaño resultante. Así que supongo que Stream.toArray() de Java también copia los datos varias veces en el proceso (?).

Si necesitamos limitar la copia al mínimo, podemos crear nuestra propia extensión:

 inline fun <reified T> Array<out Array<out T>>.flattenToArray(): Array<T> { val result = arrayOfNulls<T>(sumOf { it.size }) var pos = 0 for (arr in this) { arr.copyInto(result, pos) pos += arr.size } @Suppress("UNCHECKED_CAST") return result as Array<T> }
about 3 years ago · Santiago Trujillo Denunciar

0

Si literalmente solo quiere ponerlos en una sola matriz, puede usar el operador de propagación

 val arr1 = arrayOf("a", "b") val arr2 = arrayOf("c", "d") val result = arrayOf(*arr1, *arr2)

No estoy seguro de que haya una forma de hacerlo para un número arbitrario de arreglos fuente, así que si lo necesita, flatten es el camino a seguir. Sin embargo, esto es rápido y fácil para desempaquetar un grupo específico de matrices

about 3 years ago · Santiago Trujillo Denunciar

0

flatten() es la forma más sencilla de hacerlo. Todos los operadores de matriz estándar e iterables devuelven listas. Si realmente necesita una matriz, puede llamar a toTypedArray() en la Lista devuelta.

Puede comenzar combinándolos en una lista o matriz.

 val arr1 = arrayOf(“a”, “b”) val arr2 = arrayOf(“c”, “d”) val req = listOf(arr1, arr2).flatten() //.toTypedArray()
about 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda