2010-03-07 12 views
14

Wiem, jak to zrobić metodaString dla jednowymiarowych tablic ciągów, ale jak wydrukować dwuwymiarową tablicę? Z 1D robię to w ten sposób:drukuj dwuwymiarową tablicę ciągów jako ciąg

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(); 

Jak wydrukować tablicę 2D.

+0

Jeśli jesteś w jednowątkowym środowisku, 'klasa StringBuilder' powinny generalnie pierwszeństwo do 'StringBuffer', ponieważ obsługuje wszystkie te same operacje, ale jest szybszy, ponieważ nie wykonuje synchronizacji. – Desintegr

Odpowiedz

5

Po prostu iteracyjne dwukrotnie nad elementami:

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(']'); 
} 

WAŻNE:StringBuffer są również przydatne, ponieważ można Operacje łańcuchowe, na przykład: buffer.append(..).append(..).append(..) ponieważ zwraca odniesienie do siebie! Użyj cukru synctactic kiedy będzie dostępny ..

IMPORTANT2: ponieważ w tym przypadku masz zamiar dołączyć wiele rzeczy do StringBuffer dobrze oszacować zdolność do unikania przydzielania i przeprowadzki tablicę wielokrotnie podczas dopisuje, można to zrobić obliczanie wielkości tablicy wielowymiarowej pomnożonej przez średnią długość znaku elementu, który zamierzasz dołączyć.

+1

Metoda łańcuchowa nie ma nic wspólnego z cukrem syntaktycznym; jest to funkcja API, a nie funkcja językowa. W przeciwnym razie +1. – polygenelubricants

+3

można użyć StringBuilder, który nie jest zsynchronizowany i może być szybszy w pewnych okolicznościach – Karussell

+0

Tak, wiedziałem o tym. Synchroniczny cukier powinien uwzględniać składnię (gramatykę) języka, podczas gdy jest to tylko metoda klasy ... ale żaden inny termin nie przyszedł mi do głowy, jest to poetycka licencja :) – Jack

0

Dwa for pętle:

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

Jest to problematyczne, jeśli tablica zawiera wiele odniesień to są '=='. Na przykład nie będzie działać z 'new String [] [] {{" 1 "," 1 "}, {" 1 "," 1 "}}' z powodu interningu. Zła technika, moim zdaniem. – polygenelubricants

+0

Prawda, chociaż działa w większości przypadków. Naprawianie teraz. – Pindatjuh

53

Klasa Arrays definiuje kilka przydatnych metod

  • tablic. toString - która nie działa dla zagnieżdżonych tablic
  • Tablice. deepToString - który robi dokładnie to, co chcesz

 

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

Daje

[[hello, world], [Goodbye, planet]] 
Powiązane problemy