2010-04-21 36 views
6

Tengo algunas [] matrices de cadenas, por ejemplo:¿Cómo mezclar dos matrices en Java?

['a1', 'a2'] 
['b1', 'b2', 'b3', 'b4'] 
['c1'] 

Cómo puede mezclarlos I, de modo que consiga ['a1', 'b1', 'c1', 'a2', 'b2', 'b3', 'b4'] (0 elemento de A, entonces b, c, 1 elemento de a, b, c y así)? Gracias

Más exactamente la matriz resultante debe consistir en el primer valor de la primera matriz, luego el primer valor de la segunda matriz, ..., el primer valor de la última matriz, el segundo valor de la primera matriz, ..., el segundo valor de la última matriz, ..., el último valor de la matriz más grande. Si las matrices no son del mismo tamaño, las más pequeñas simplemente no se tienen en cuenta.

Aquí hay un ejemplo:

a1 a2 a3 a4 
b1 b2 b3 b4 b5 b6 b7 
c1 c2 
d1 d2 d3 d4 d5 

Combines into (brackets are just to highlight steps, so they really mean nothing): 
(a1 b1 c1 d1) (a2 b2 c2 d2) (a3 b3 d3) (a4 b4 d4) (b5 d5) (b6) (b7) 

También, me gustaría combinar número variable de matriz, no sólo 3 o 4

+0

¿Puede describir con más precisión cómo deben mezclarse? – Roman

Respuesta

17
String result[] = new String[a.length+b.length+c.length]; 
for (int i = 0, j = 0; j < result.length; ++i) { 
    if (i < a.length) { 
     result[j++] = a[i]; 
    } 
    if (i < b.length) { 
     result[j++] = b[i]; 
    } 
    if (i < c.length) { 
     result[j++] = c[i]; 
    } 
} 

ACTUALIZACIÓN: más generalmente

String[] merge(String[]... arrays) { 
    int length = 0; 
    for (String[] a: arrays) { 
     length += a.length; 
    } 
    String result[] = new String[length]; 
    for (int i = 0, j = 0; j < length; ++i) { 
     for (String[] a: arrays) { 
      if (i < a.length) { 
       result[j++] = a[i]; 
      } 
     } 
    } 
    return result; 
} 
+2

+1 para varargs ... Ahora conviértalo en un método genérico, T [] fusionar (T [] ... arrays) y estamos hablando;) bien hecho – basszero

+0

@basszero: sí, es una buena idea –

+0

@ basszero: pequeño problema: la creación de una matriz de tipo genérico no está permitida. –

-1
ArrayList al = new ArrayList(); 
al.Add(array1); 
al.Add(array2); 
al.Add(array3); 

que es probablemente la mejor opción, o que se ejecutará en ArrayIndexOutOfBound-style problems. Probablemente te topes con esto también

+1

N.B. Sin embargo, eso no dará la orden que el afiche quiere. –

0

Para una tarea como esa, probablemente yo mismo lanceé. Crearía un nuevo String[] con el tamaño del a.length + b.length + c.length y luego usaría un ciclo for pasado de moda, iterando Math.max(a.length, Math.max(b.length, c.length)) veces. Dentro del ciclo, agregaría un elemento de cada uno, probando el índice con la longitud antes de hacerlo para evitar excepciones de límites.

También se ha señalado correctamente en otro lugar que necesitaría hacer un seguimiento del índice del último elemento agregado a la matriz agregada.

0

Si te entiendo correctamente, necesitas alguna función que combine tus matrices tomando 1 siguiente elemento de cada matriz si la matriz tiene el siguiente elemento.

Tendrá que crear gama adicional de índices (ver en el ejemplo) para realizar un seguimiento cuando matriz tiene o no tiene elementos para fusionar:

int[] indexes; //should be initialized with 0's 

void int[] mergeArrays(int[] ... arrays) { 
    int totalLength = 0; 
    for (int[] array : arrays) { 
     totalLength += array.length; 
    } 
    int[] result = new int[totalLength]; 

    indexes = new int[arrays.length]; //array of indexes 
    int mergeIndex = 0; 
    while (mergeIndex < totalLength) { 
     for (int j = 0; j < arrays.length; j++) { 
     if (indexes[j] != -1) { 
      changed = true; 
      result[mergeIndex++] = arrays[j][indexes[j]]; 
      indexes[j]++; 
      if (arrays[j].length == indexes[j]) { 
       indexes[j] = -1; 
      } 
     } 
     } 
    } 
    return result; 
} 
0

Desde su descripción (en las que necesita toda la 0th elementos, entonces todo el primero, etc, y donde las matrices pueden ser de diferentes tamaños), a continuación, para una fácil de entender el método (pero no el más eficiente) me gustaría hacer lo siguiente:

  • crear una número de Listas que contienen los contenidos de una de las matrices
  • crear una lista para mantener el resultado final
  • ciclo continuamente a través de las listas, la eliminación del elemento 0th, y agregarlo a su lista de resultados, hasta que ninguna de las listas contiene ningún elemento más

Usted puede evitar la creación de las listas y hacer las cosas de manera más eficiente con solo tener una matriz de índices que le diga qué elemento tiene en cada arreglo, pero la conversión a Listas puede hacer que el problema sea más fácil de conceptualizar.

-1
String[] arr0 = ["a1", "a2"]; 
    String[] arr1 = ["b1", "b2", "b3", "b4"]; 
    String[] arr2 = ["c1"]; 
    int length = arr0.length + arr1.length + arr2.length; 
    int max = Math.max(arr0.length, Math.max(arr1.length, arr2.length)); 
    int index = 0; 
    String[] result = new String[length]; 
    for (int i=0; i<max; i++){ 
     if (i<arr0.length) 
      result[index++] = arr0[i]; 
     if (i<arr1.length) 
      result[index++] = arr1[i]; 
     if (i<arr2.length) 
      result[index++] = arr2[i]; 
    } 
+0

Esto es completamente incorrecto. Debe tener una variable auxiliar que lo apunte al índice en el que está escribiendo actualmente en el resultado. –

+0

@Petar, gracias se arregló. –

1
String[] answer = new String[a.length + b.length + c.length]; 
int maxLength = Math.max(a.length, Math.max(b.length, c.length)); 

int counter = 0;  
for (int i = 0; i < maxLength; i++) 
{ 
    if (i < a.length) 
     answer[counter++] = a[i]; 

    if (i < b.length) 
     answer[counter++] = b[i]; 

    if (i < c.length) 
     answer[counter++] = c[i]; 
} 
+0

No soy un cazador de reputación, pero ¿por qué el voto negativo es, en mi opinión, código correcto? Al menos, deja un comentario así sé lo que hice mal. –

+1

+1: En realidad, esta es la solución más realista que veo en este montón de respuestas de alta tecnología. – xtofl

-1

Todas las respuestas anteriores son terribles y se puede lograr en 3 estados si se reutiliza System.arraycopy para construir una matriz suficientemente grande como para mantener todos los elementos de ambas matrices. Después de eso, use los métodos Array.sort para ordenar esta gran serie que pasa en un Comparador. No es necesario escribir su propia clasificación de burbuja/fusión cuando ya existe una perfectamente perfecta.

+0

Aunque estoy de acuerdo con la idea de fealdad, la clasificación no ayuda, ya que el Comparador al que se refiere se volvería horrible. Es un simple "zip" que se necesita ... – xtofl

+0

Para ser honesto, considero que su propuesta es mucho más fea que la solución general que publicó Maurice Perry. –

+0

Sí, lo siento, apresuré mi respuesta :) –