2012-02-06 8 views
5

Considere las siguientes entradas:Java Stringbuilder.replace

String[] input = {"a9", "aa9", "a9a9", "99a99a"}; 

lo que sería la forma más eficiente, mientras que el uso de un StringBuilder para reemplazar cualquier dígito directamente antes de un nueve con la siguiente letra después de que en el alfabeto?

Después de procesar estas entradas la salida debe ser:

String[] output = {"b9", "ab9", "b9b9", "99b99a"} 

he estado rascando la cabeza por un tiempo y la StringBuilder.setCharAt era el mejor método que podía pensar.

Cualquier consejo o sugerencia sería apreciada.

+0

¿Y cuál es el problema con este método, si funciona según lo previsto? –

+1

No creo que puedas hacer esto con un regex ... –

+0

@LouisWasserman: Sí, puedes, por favor, mira mi respuesta a continuación. – anubhava

Respuesta

2

Dado que debe observar cada carácter, nunca tendrá un rendimiento mejor que el lineal en el tamaño del búfer. Por lo que sólo puede hacer algo como

for (int i=1; buffer.length() ++i) // Note this starts at "1" 
    if (buffer.charAt[i] == '9') 
     buffer.setCharAt(i-1, buffer.getCharAt(i-1) + 1); 
0

Desea utilizar una máquina de estado muy simple. Para cada personaje que está recorriendo en la cadena de entrada, haga un seguimiento de un booleano. Si el caracter es un 9, establece el booleano en verdadero. Si el carácter es una letra, agregue uno a la letra y establezca el valor booleano en falso. A continuación, agregue el carácter al generador de cadenas de salida.

Para la entrada utilizas un Reader. Para salida use StringBuilder.

0

utiliza un identificador de 1 mirar hacia delante técnica analizador. Aquí hay un código psuedoish:

for (int index = 0; index < buffer.length(); ++index) 
{ 
    if (index < buffer.length() - 1) 
    { 
    if (buffer.charAt(index + 1) == '9') 
    { 
     char current = buffer.charAt(index) + 1; // this is probably not the best technique for this. 
     buffer.setCharAt(index, current); 
    } 
    } 
} 
0

otra solución es utilizar, por ejemplo

StringUtils.indexOf(String str, char searchChar, int startPos) 

de una manera como se señaló Ernest Friedman-Hill, tomar este ejemplo como experimental, no es el mas potente

1

puede siguiente código:

String[] input = {"a9", "aa9", "a9a9", "99a99a", "z9", "aZ9"}; 
String[] output = new String[input.length]; 
Pattern pt = Pattern.compile("([a-z])(?=9)", Pattern.CASE_INSENSITIVE); 
for (int i=0; i<input.length; i++) { 
    Matcher mt = pt.matcher(input[i]); 
    StringBuffer sb = new StringBuffer(); 
    while (mt.find()) { 
     char ch = mt.group(1).charAt(0); 
     if (ch == 'z') ch = 'a'; 
     else if (ch == 'Z') ch = 'A'; 
     else ch++; 
     mt.appendReplacement(sb, String.valueOf(ch)); 
    } 
    mt.appendTail(sb); 
    output[i] = sb.toString(); 
} 
System.out.println(Arrays.toString(output)); 

SALIDA:

[b9, ab9, b9b9, 99b99a, a9, aA9]