2010-04-14 9 views
11

Me preguntaba cuál es la forma más fácil de convertir un número entero en el número equivalente de espacios en blanco. Lo necesito para los espacios entre nodos al imprimir un árbol de búsqueda binario. Intenté estoConversión de entero a un número equivalente de espacios en blanco

int position = printNode.getPosition(); 
    String formatter = "%1"+position+"s%2$s\n"; 
    System.out.format(formatter, "", node.element); 

Pero estoy obteniendo casi 3 veces más espacios en comparación con el valor int de la posición. No estoy seguro de si estoy formateando la cadena correctamente. ¡Cualquier sugerencia sería genial! Si lo hace más claro, decir posición = 6; Quiero 6 espacios en blanco impresos antes de mi elemento nodo.

Respuesta

11

creo que quería decir algo como:

int n = 6; 
    String s = String.format("%1$#"+n+"s", ""); 

System.out.format("[%13s]%n", ""); // prints "[    ]" (13 spaces) 
System.out.format("[%1$3s]%n", ""); // prints "[ ]" (3 spaces) 
+2

+1. Esta respuesta es la solución más simple al problema original de OP: a OP le faltaba el carácter '$'. – polygenelubricants

4

¿Por qué no recorrer el número entero y agregar un espacio en cada iteración?

String spaces = ""; 
for (int i = 0 ; i < position ; i++) spaces += " "; 

Y puede utilizar StringBuilder en lugar de cuerdas, si position podría obtener muy grande y el rendimiento es un problema.

+5

Si va a hacer código como este, yo insisto (si usted está en mi equipo) que utiliza un StringBuilder. Independientemente de cuántas veces haya realizado un bucle, el uso de cadenas como esta es muy ineficiente y no se recomienda porque el compilador usará StringBuilders internamente para hacer el trabajo de todos modos. Pero en lugar de hacerlo una vez, lo hará en cada ciclo. También mira la clase de formateador. Es doco habla sobre justificar los números usando la especificación de ancho. – drekka

8

Se puede crear un char[] de la longitud deseada, Arrays.fill con espacios, y luego crear un String fuera de él (o simplemente append a su propio StringBuilder etc.).

import java.util.Arrays; 

int n = 6; 
char[] spaces = new char[n]; 
Arrays.fill(spaces, ' '); 
System.out.println(new String(spaces) + "!"); 
// prints "  !" 

Si estás haciendo esto con una gran cantidad de posibles valores de n, en lugar de crear y rellenar new char[n] cada vez, puede crear sólo una lo suficientemente larga cadena de espacios y tomar más corto substring según sea necesario.

+0

Creo que esto será más rápido que el buffer de cadena. –

4

solución foward recta:

int count = 20; 

StringBuilder sb = new StringBuilder(count); 
for (int i=0; i < count; i++){ 
sb.append(" "); 
} 
String s = sb.toString(); 

StringBuilder es eficiente en términos de velocidad.

+0

Debo agregar "' String spaces = sb.toString(); '" –

+0

Derecha, agregué al código. – Sylar

7

Ésta es una forma fácil, pero la basura, así:

int count = 20; 
String spaces = String.format("%"+count+"s", ""); 

o rellenado

String spaces = String.format("%20s", ""); 
+1

¿Por qué sería esto basura? – polygenelubricants

0

He aquí un ejemplo:

public class NestedLoop { 
public static void main (String [] args) { 
    int userNum = 0; 
    int i = 0; 
    int j = 0; 


    while (i<=userNum) { 
    System.out.println(i); 
    ++i; 
    if (i<=userNum) { 
    for (j=0;j<i;j++) { 
     System.out.print(" "); 
    } 
    } 
    } 
    return; 
    } 
} 

Si hacemos userNum = 3, el La salida sería:

0 
1 
    2 
    3 

Espero que ayude!

0

Si uno se va a utilizar una solución iterativa de todos modos, uno podría querer hacerlo de una manera más "maravilloso", como:

def spaces=6 
print ((1..spaces).collect(" ").join()) 

Tenga en cuenta que esto no funciona para cero espacios.para eso es posible que desee algo más como:

print (spaces?(1..spaces).collect(" ").join():"") 
Cuestiones relacionadas