Necesito concatenar dos String
matrices 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 + array2
concatenació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
T
lugar 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
List
objetos 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
T
conbyte
(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óndeai
estáInteger[]
y dóndead
estáDouble[]
. (En este caso, el compilador<T>
resuelve el parámetro de tipo<? extends Number>
). La matriz creada porArrays.copyOf
tendrá el tipo de componente de la primera matriz, es decir,Integer
en este ejemplo. Cuando la función está a punto de copiar la segunda matriz, seArrayStoreException
lanzará un . La solución es tener unClass<T> type
parámetro adicional .Utilizando
Stream
en 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 tipoStream
más bien que por ejemplo,IntStream
que no se pueden pasar como un parámetro aStream.concat
.a
yb
sonint[]
, 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
for
bucles 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
null
cheques. Y quizás establezca algunas de sus variables enfinal
.null
comprobaciones 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.arraycopy
copia el contenido de la matriz?if
declaraciones 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
String
Código de muestra para concatenar dos String Array
Si quieres concatenar
Int
Có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
Integer
matriz: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
for
bucle 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 primerfor
bucle. 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)
. Mientrasarr1
yarr2
sean 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