java - long - println c++
La impresiĆ³n con "/ t"(pestaƱas) no da como resultado columnas alineadas (8)
Tengo un problema muy extraño. Después de escribir esto:
for (File f : currentFile.listFiles()) {
if (f.isDirectory()){
System.out.println(f.getName()+"/t"+"Dir/t"+Command.getpremission(f)+"/t"+f.getTotalSpace());
}
else{
System.out.println(f.getName()+"/t"+"File/t"+Command.getpremission(f)+"/t"+f.getTotalSpace());
}
Veo esto impreso:
see.txt File rw 267642728448
see1.txt File rw 267642728456
see2.txt File rw 267642728448
¿Por qué hay un problema con las pestañas?
Como lo mencionaron otras personas, la longitud variable de la cadena es el problema.
En lugar de reinventar la rueda, Apache Commons tiene una solución agradable y limpia para esto en StringUtils.
StringUtils.rightPad("String to extend",100); //100 is the length you want to pad out to.
El "problema" con las pestañas es que sangran el texto en posiciones de pestañas fijas, generalmente múltiplos de 4 u 8 caracteres (según la consola o el editor que los muestre). Su primer nombre de archivo es de 7 caracteres, por lo que la siguiente tabulación después de su final se encuentra en la posición 8. Sin embargo, sus siguientes nombres de archivo tienen 8 caracteres de largo, por lo que la siguiente tabulación está en la posición 12.
Si desea asegurarse de que las columnas estén bien sangradas en la misma posición, debe tener en cuenta la longitud real de las columnas anteriores y, en su lugar, modificar el número de pestañas siguientes o rellenar con el número de espacios necesarios. Esto último se puede lograr utilizando, por ejemplo, System.out.printf
con una especificación de formato apropiada (por ejemplo, "%1$13s"
especifica un ancho mínimo de 13 caracteres para mostrar el primer argumento como una cadena).
El problema es la longitud de los nombres de archivo. El primer nombre de archivo tiene solo 7 caracteres de largo, por lo que la pestaña aparece en char 8 (haciendo una pestaña después de cada 4 caracteres). Sin embargo, los siguientes nombres de archivo tienen 8 caracteres de largo, por lo que la siguiente pestaña no será hasta el carácter 12. Y si tuviera nombres de archivo de más de 11 caracteres, se encontraría nuevamente con el mismo problema.
En la continuación de los comentarios de Péter y duncan, normalmente uso un método de relleno rápido, algo así como ...
public String rpad(String inStr, int finalLength)
{
return (inStr + " " // typically a sufficient length spaces string.
).substring(0, finalLength);
}
Del mismo modo, puede tener un lpad()
también
La longitud del texto que está proporcionando en cada línea es diferente, este es el problema, por lo que si la segunda palabra es demasiado larga ( see2.txt
tiene una longitud de 8 caracteres que corresponde a una sola pestaña) imprime una pestaña que va al siguiente punto de tabulación. Una forma de resolverlo es agregar programáticamente un pad al texto f.getName()
para que cada texto generado: see.txt
o see2.txt
tenga la misma longitud (por ejemplo, see.txt_
y see2.txt
) para que cada pestaña automáticamente va al mismo punto de tabulación.
Si está desarrollando con JDK 1.5 puede resolver esto usando java.util.Formatter :
String format = "%-20s %5d/n";
System.out.format(format, "test", 1);
System.out.format(format, "test2", 20);
System.out.format(format, "test3", 5000);
este ejemplo le dará esta impresión:
test 1
test2 20
test3 5000
Puede usar este ejemplo para manejar su problema:
System.out.printf( "%-15s %15s %n", "name", "lastname");
System.out.printf( "%-15s %15s %n", "Bill", "Smith");
Puede jugar con el "%" hasta que encuentre la alineación correcta para satisfacer sus necesidades
Sobre la base de esta pregunta , uso el siguiente código para sangrar mis mensajes:
String prefix1 = "short text:";
String prefix2 = "looooooooooooooong text:";
String msg = "indented";
/*
* The second string begins after 40 characters. The dash means that the
* first string is left-justified.
*/
String format = "%-40s%s%n";
System.out.printf(format, prefix1, msg);
System.out.printf(format, prefix2, msg);
Este es el resultado:
short text: indented looooooooooooooong text: indented
También puede rellenar una cadena con la longitud requerida usando Guava''s Strings.padEnd (String input, int minLength, char padding)