2010-07-13 17 views
6

? Por diversas razones, estoy tratando de establecer una cadena en 2000 espacios. Actualmente estoy usando:¿De qué maneras puede crear una cadena con 2000 "espacios"

String s = String.format("%1$-2000s"," "); 

Esto es grande para Java 5, sin embargo, algunos de los desarrolladores en nuestro departamento están utilizando 1.4 y esto no funciona.

Me preguntaba, ¿hay alguna otra forma de lograr el mismo resultado? Sé que puedo hacer cosas como un bucle for para agregar un espacio a la vez, pero estoy buscando algo simple como la opción de formato.

Para aquellos que pueden estar interesados ​​en por qué necesito esto, es porque tenemos un tipo XML en un objeto de datos que en la inserción en el DB es nulo. Luego se actualiza con la cadena XML, generalmente alrededor de 2000 caracteres de tamaño. En Oracle, reservar previamente este espacio puede evitar la migración de fila, por lo tanto, aumentar el rendimiento.

Gracias!

+0

Inserta un único espacio en un campo char (2000) en una base de datos, luego selecciónalo para que salga. – aehiilrs

+0

¿esto realmente reserva todo el bloque 2000? – northpole

+0

¿Qué versión de Oracle y usa XMLTYPE? En caso afirmativo, ¿cuál es la cláusula de almacenamiento para XMLTYPE? – oluies

Respuesta

18
char[] spacesArray = new char[2000]; 
Arrays.fill(spacesArray, ' '); 
String spaces = new String(spacesArray); 
1

Un StringBuffer y luego agrega un espacio 2000 veces en un bucle, y toString() después. No creo que existan formas "más simples" de hacerlo, lo que no termina haciendo esto de todos modos bajo las sábanas.

Si haces esto mucho, sería una buena función de biblioteca.

+3

Puede usar un StringBuilder en su lugar para evitar la sobrecarga de sincronización pequeña, y también puede inicializar el generador con el tamaño de destino para que no tenga lugar ninguna realocación. –

+0

StringBuilder no está disponible en Java 1.4, sobre el que pregunta el póster original. –

0

StringUtils.repeat(" ", 2000) (desde commons-lang)

Sin embargo, no estoy seguro de si tales micro-optimizaciones deben realizarse con el costo de código que requeriría un comentario 5 líneas para explicar por qué es esto necesario. Si lo hace, asegúrese de agregar un comentario extenso; de lo contrario, imagine la reacción de quienes leen su código.

+0

ya, mi función está muy bien documentada por esa razón – northpole

+5

@downvoter - ¿podría explicar el voto a la baja? ¿No te gusta commons-lang, o mi nota sobre el comentario? – Bozho

1

una función aleatoria que encontré en mi biblioteca personal:

public static String whiteSpace2(int l) { 
    if (l==0) return ""; 
    String half=whiteSpace2(l/2); 
    if ((l&1)!=0) { 
     return half+" "+half; 
    } else { 
     return half+half; 
    } 
} 

No afirmando que es la manera más rápida posible generar espacios en blanco, pero funciona :-)

+0

p.s. Creo que este es el momento de O (n), así que en realidad no debería ser tan malo ... – mikera

+1

+1 si es una broma, es bastante divertido. –

+0

Realmente no debería construir cadenas con '+' como este. Use un 'StringBuilder'. Sin embargo, el paso 'O (log N)' es bueno. – polygenelubricants

0

Si nada más funciona:

StringBuilder sb = new StringBuilder(); 
for(int i = 0; i < 2000; ++i) 
    sb.append(" "); 
String str = new String(sb); 
+7

¿por qué no simplemente 'sb.toString()' –

1

Puede usar lpad(' ',2000,' ') en la instrucción de inserción directamente para indicarle a Oracle que cree el valor que desea.

De hecho, puede configurar el campo en cuestión para tener esto como el valor predeterminado, lo que podría evitar que tenga que cambiarlo en varios lugares (si su código envía explícitamente nulo como el valor para el campo, eso anular el valor predeterminado).

3

la respuesta más simple: (desplazarse para ver todos los códigos)

String s = "                                                                                                                                                                                                                          "; // 2000 spaces 
+0

¿Los contó? –

+1

+1 Me gusta esta solución. Si sabemos en tiempo de compilación qué es la cadena, ¿por qué no codificarla? (Sin embargo, probablemente sea mejor otra solución que involucre la base de datos en sí misma.) Reduje la solución para que sea un poco mejor y responda la pregunta de Pascal. Ejecútelo con aserciones habilitadas. Cadena s = ... 2000 espacios ...; assert s.length() == 2000: "la cadena constante tiene una longitud incorrecta". ; – emory

Cuestiones relacionadas