2010-03-07 17 views
14

Sé cómo hacer el método String para matrices unidimensionales de cadenas, pero ¿cómo imprimir una matriz bidimensional? Con 1D lo hago de esta manera:imprimir una matriz bidimensional de cadenas como String

public String toString() { 
    StringBuffer result = new StringBuffer(); 
    res = this.magnitude; 

    String separator = ""; 
    if (res.length > 0) { 
     result.append(res[0]); 
     for (int i=1; i<res.length; i++) { 
      result.append(separator); 
      result.append(res[i]); 
     } 
    } 
return result.toString(); 

Cómo imprimir una matriz 2D.

+0

Si se encuentra en un entorno de un solo subproceso, la clase 'StringBuilder' general se debe utilizar con preferencia a 'StringBuffer' ya que admite todas las mismas operaciones, pero es más rápido, ya que no realiza ninguna sincronización. – Desintegr

Respuesta

5

Sólo iterar dos veces en los elementos:

StringBuffer results = new StringBuffer(); 
String separator = "," 
float[][] values = new float[50][50]; 

// init values 

for (int i = 0; i < values.length; ++i) 
{ 
    result.append('['); 
    for (int j = 0; j < values[i].length; ++j) 
    if (j > 0) 
     result.append(values[i][j]); 
    else 
     result.append(values[i][j]).append(separator); 
    result.append(']'); 
} 

IMPORTANTE:StringBuffer también son útiles porque se puede operaciones de la cadena, por ejemplo: buffer.append(..).append(..).append(..) ya que devuelve una referencia a uno mismo! Utilizar el azúcar synctactic cuando esté disponible ..

important2: ya que en este caso va a agregar muchas cosas a la StringBuffer que es bueno para estimar la capacidad de evitar la asignación y la reubicación de la matriz muchas veces durante APPENDs, puede hacerlo calcular el tamaño de la matriz multidimensional multiplicado por la longitud promedio del carácter del elemento que planea agregar.

+1

El método de encadenamiento no tiene nada que ver con el azúcar sintáctico; es una función API, no una función de idioma. De lo contrario, +1. – polygenelubricants

+3

podría usar StringBuilder que no está sincronizado y podría ser más rápido en algunas circunstancias – Karussell

+0

Sí, lo sabía. El azúcar sintáctico debería tener en cuenta la sintaxis (gramática) del lenguaje, mientras que este es solo un método de la clase ... pero no me vino a la mente ningún otro término, véalo como una licencia poética :) – Jack

0

Dos for bucles:

for (int i=1; i<res.length; i++) { 
    for (int j=1; j<res[i].length; j++) { 
     result.append(separator); 
     result.append(res[i][j]); 
    } 
} 
1
public static <T> String to2DString(T[][] x) { 
    final String vSep = "\n"; 
    final String hSep = ", "; 
    final StringBuilder sb = new StringBuilder(); 

    if(x != null) 
    for(int i = 0; i < x.length; i++) { 
     final T[] a = x[i]; 
     if(i > 0) { 
      sb.append(vSep); 
     } 
     if(a != null) 
     for(int j = 0; j < a.length; j++) { 
      final T b = a[j]; 
      if(j > 0) { 
       sb.append(hSep); 
      } 
      sb.append(b); 
     } 
    } 
    return sb.toString(); 
} 
+0

Esto es problemático si la matriz contiene múltiples referencias que son '=='. Por ejemplo, no funcionaría con 'new String [] [] {{" 1 "," 1 "}, {" 1 "," 1 "}}' debido a la internación. Mala técnica, en mi opinión. – polygenelubricants

+0

Es cierto, mientras que funciona en la mayoría de los casos. Arreglando ahora. – Pindatjuh

53

La clase Arrays define un par de métodos útiles

  • matrices. toString - que no funciona para matrices anidadas
  • Arrays. deepToString - que hace exactamente lo que quiere

 

String[][] aastr = {{"hello", "world"},{"Goodbye", "planet"}}; 
System.out.println(Arrays.deepToString(aastr)); 

Da

[[hello, world], [Goodbye, planet]] 
Cuestiones relacionadas