Necesito concatenar dos Stringmatrices en Java.
void f(String[] first, String[] second) {
String[] both = ???
}
¿Cuál es la forma más fácil de hacer esto?
java
arrays
concatenation
add
Antti Kissaniemi
fuente
fuente

array1 + array2concatenación simple .Respuestas:
Encontré una solución de una línea de la vieja y buena biblioteca Apache Commons Lang.
ArrayUtils.addAll(T[], T...)Código:
fuente
Aquí hay un método simple que concatenará dos matrices y devolverá el resultado:
Tenga en cuenta que no funcionará con tipos de datos primitivos, solo con tipos de objetos.
La siguiente versión un poco más complicada funciona con objetos y matrices primitivas. Lo hace utilizando en
Tlugar deT[]como el tipo de argumento.También hace posible concatenar matrices de dos tipos diferentes seleccionando el tipo más general como el tipo de componente del resultado.
Aquí hay un ejemplo:
fuente
Array.newInstance(a.getClass().getComponentType(), aLen + bLen);. Sorprendentemente, nunca he visto eso antes. @beaudet Creo que la anotación está bien aquí, considerando por qué está siendo suprimida.Es posible escribir una versión totalmente genérica que incluso se puede extender para concatenar cualquier número de matrices. Estas versiones requieren Java 6, ya que usan
Arrays.copyOf()Ambas versiones evitan crear
Listobjetos intermedios y usarSystem.arraycopy()para garantizar que copiar matrices grandes sea lo más rápido posible.Para dos matrices se ve así:
Y para un número arbitrario de matrices (> = 1) se ve así:
fuente
Tconbyte(y pierda el<T>).ByteBuffer buffer = ByteBuffer.allocate(array1.length + array2.length); buffer.put(array1); buffer.put(array2); return buffer.array();concat(ai, ad), dóndeaiestáInteger[]y dóndeadestáDouble[]. (En este caso, el compilador<T>resuelve el parámetro de tipo<? extends Number>). La matriz creada porArrays.copyOftendrá el tipo de componente de la primera matriz, es decir,Integeren este ejemplo. Cuando la función está a punto de copiar la segunda matriz, seArrayStoreExceptionlanzará un . La solución es tener unClass<T> typeparámetro adicional .Utilizando
Streamen Java 8:O así, usando
flatMap:Para hacer esto para un tipo genérico, debe usar la reflexión:
fuente
.boxed()por lo que son de tipoStreammás bien que por ejemplo,IntStreamque no se pueden pasar como un parámetro aStream.concat.aybsonint[], el usoint[] both = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).toArray();System.arrayCopy. Pero tampoco particularmente lento. Es probable que tenga que hacer esto una muy muchas veces con grandes matrices en realidad contextos sensibles al rendimiento de la diferencia de tiempo de ejecución a la materia.O con la amada guayaba :
Además, hay versiones para matrices primitivas:
Booleans.concat(first, second)Bytes.concat(first, second)Chars.concat(first, second)Doubles.concat(first, second)Shorts.concat(first, second)Ints.concat(first, second)Longs.concat(first, second)Floats.concat(first, second)fuente
Puede agregar las dos matrices en dos líneas de código.
Esta es una solución rápida y eficiente y funcionará para tipos primitivos, así como los dos métodos involucrados están sobrecargados.
Debe evitar las soluciones que involucran ArrayLists, streams, etc., ya que necesitarán asignar memoria temporal sin ningún propósito útil.
Debe evitar los
forbucles para matrices grandes, ya que no son eficientes. Los métodos incorporados utilizan funciones de copia en bloque que son extremadamente rápidas.fuente
Usando la API de Java:
fuente
both.toArray(new String[0])será más rápido queboth.toArray(new String[both.size()]), incluso si contradice nuestra intuición ingenua. Por eso es tan importante medir el rendimiento real al optimizar. O simplemente use la construcción más simple, cuando no se pueda probar la ventaja de la variante más complicada.Una solución 100% antigua de Java y sin ella
System.arraycopy(no disponible en el cliente GWT, por ejemplo):fuente
nullcheques. Y quizás establezca algunas de sus variables enfinal.nullcomprobaciones de @TrippKinetics ocultarían los NPE en lugar de mostrarlos y el uso de final para vars locales no tiene ningún beneficio (todavía).Recientemente he luchado contra problemas con la rotación excesiva de memoria. Si se sabe que ayb están comúnmente vacíos, aquí hay otra adaptación del código de silvertab (también generado):
Editar: una versión anterior de esta publicación declaró que la reutilización de matrices como esta debe documentarse claramente. Como señala Maarten en los comentarios, en general sería mejor simplemente eliminar las declaraciones if, anulando así la necesidad de tener documentación. Pero, de nuevo, esas declaraciones if fueron el punto central de esta optimización particular en primer lugar. Dejaré esta respuesta aquí, ¡pero ten cuidado!
fuente
System.arraycopycopia el contenido de la matriz?ifdeclaraciones fuera sería la solución más fácil.La biblioteca funcional de Java tiene una clase de envoltorio de matriz que equipa las matrices con métodos útiles como la concatenación.
...y entonces
Para recuperar la matriz desenvuelta, llame a
fuente
fuente
both.toArray(new String[both.size()])Otra forma con Java8 usando Stream
fuente
Aquí hay una adaptación de la solución de silvertab, con genéricos reacondicionados:
NOTA: Vea la respuesta de Joachim para una solución Java 6. No solo elimina la advertencia; ¡también es más corto, más eficiente y más fácil de leer!
fuente
Si lo usa de esta manera, no necesita importar ninguna clase de terceros.
Si quieres concatenar
StringCódigo de muestra para concatenar dos String Array
Si quieres concatenar
IntCódigo de muestra para concatar dos matrices enteras
Aquí está el método principal
Podemos usar de esta manera también.
fuente
Perdóname por agregar otra versión a esta lista ya larga. Miré cada respuesta y decidí que realmente quería una versión con solo un parámetro en la firma. También agregué algunas comprobaciones de argumentos para beneficiarse de una falla temprana con información sensible en caso de entrada inesperada.
fuente
Puede intentar convertirlo en una Arraylist y usar el método addAll y luego volver a convertirlo en una matriz.
fuente
Usando flujos Java 8+ puedes escribir la siguiente función:
fuente
Aquí una posible implementación en el código de trabajo de la solución de pseudocódigo escrita por silvertab.
Gracias silvertab!
El siguiente es la interfaz del generador.
Nota: Un generador es necesario porque en Java no es posible hacer
new T[size]debido a la eliminación de tipo genérico:
Aquí un constructor concreto implementando la interfaz, construyendo una
Integermatriz:Y finalmente la aplicación / prueba:
fuente
Esto debería ser de una sola línea.
fuente
¡Guauu! Aquí hay muchas respuestas complejas, incluidas algunas simples que dependen de dependencias externas. ¿Qué tal hacerlo así:
fuente
Esto funciona, pero debe insertar su propia comprobación de errores.
Probablemente no sea el más eficiente, pero no se basa en otra cosa que no sea la propia API de Java.
fuente
forbucle con eso:for(int j = 0; j < arr2.length; j++){arrBoth[arr1.length+j] = arr2[j];}String[] arrBoth = java.util.Arrays.copyOf(arr1, arr1.length + arr2.length)para omitir el primerforbucle. Ahorra tiempo proporcional al tamaño dearr1.Esta es una función convertida para una matriz de cadenas:
fuente
¿Qué tal simplemente
Y solo hazlo
Array.concat(arr1, arr2). Mientrasarr1yarr2sean del mismo tipo, esto le dará otra matriz del mismo tipo que contiene ambas matrices.fuente
Una versión estática genérica que utiliza System.arraycopy de alto rendimiento sin requerir una anotación @SuppressWarnings:
fuente
fuente
Aquí está mi versión ligeramente mejorada del concatAll de Joachim Sauer. Puede funcionar en Java 5 o 6, utilizando System.arraycopy de Java 6 si está disponible en tiempo de ejecución. Este método (en mi humilde opinión) es perfecto para Android, ya que funciona en Android <9 (que no tiene System.arraycopy) pero utilizará el método más rápido si es posible.
fuente
Otra forma de pensar sobre la pregunta. Para concatenar dos o más matrices, uno debe hacer una lista de todos los elementos de cada matriz y luego construir una nueva matriz. Esto suena como crear un
List<T>y luego lo invocatoArray. Algunas otras respuestas usanArrayList, y eso está bien. Pero, ¿qué tal si implementamos el nuestro? No es dificil:Creo que lo anterior es equivalente a las soluciones que utiliza
System.arraycopy. Sin embargo, creo que este tiene su propia belleza.fuente
Qué tal si :
fuente
Una variación simple que permite la unión de más de una matriz:
fuente
Usando solo la propia API de Javas:
Ahora, este código no es el más eficiente, pero se basa solo en clases estándar de Java y es fácil de entender. Funciona para cualquier número de String [] (incluso cero arrays).
fuente