Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

296
Views
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.

over 4 years ago · Santiago Trujillo
5 answers
Answer question

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

over 4 years ago · Santiago Trujillo Report

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).

over 4 years ago · Santiago Trujillo Report

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> }
over 4 years ago · Santiago Trujillo Report

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

over 4 years ago · Santiago Trujillo Report

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()
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!