respuesta tardía pero si usted no desea codificar el ancho, la forma de algo que funciona así:
public static void main(String[] args) {
new Columns()
.addLine("One", "Two", "Three", "Four")
.addLine("1", "2", "3", "4")
.print()
;
}
y muestra:
One Two Three Four
1 2 3 4
Bueno, todo lo que necesita es:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Columns {
List<List<String>> lines = new ArrayList<>();
List<Integer> maxLengths = new ArrayList<>();
int numColumns = -1;
public Columns addLine(String... line) {
if (numColumns == -1){
numColumns = line.length;
for(int column = 0; column < numColumns; column++) {
maxLengths.add(0);
}
}
if (numColumns != line.length) {
throw new IllegalArgumentException();
}
for(int column = 0; column < numColumns; column++) {
int length =
Math.max(
maxLengths.get(column),
line[column].length()
)
;
maxLengths.set(column, length);
}
lines.add(Arrays.asList(line));
return this;
}
public void print(){
System.out.println(toString());
}
public String toString(){
String result = "";
for(List<String> line : lines) {
for(int i = 0; i < numColumns; i++) {
result += pad(line.get(i), maxLengths.get(i) + 1);
}
result += System.lineSeparator();
}
return result;
}
private String pad(String word, int newLength){
while (word.length() < newLength) {
word += " ";
}
return word;
}
}
Dado que no se imprimirá hasta que tenga todas las líneas, se puede aprender de ancho para hacer las columnas. No hay necesidad de codificar el ancho.
Más detalles sobre el formato de cadenas de Java en [los documentos] (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax) – Rodrigue
¿Cuál es la diferencia entre '% -30.30s' y '% -30s'? –
@JohnRPerry Con .30, el ancho máximo del campo es 30. Los valores más largos se truncarán. – erickson