2009-11-13 25 views
9

Quiero cambiar una cadena de modo que todos los caracteres en mayúsculas se convierten en minúsculas, y todos los caracteres en minúsculas se convierten en mayúsculas. Los caracteres numéricos simplemente se ignoran.¿Cómo puedo invertir la caja de una cadena en Java?

por lo que "abcde123" se convierte en "abcde123"

supongo que debe haber una manera de iterar a través de la cadena y voltear cada personaje, o quizás alguna expresión regular que podría hacerlo.

+3

No, expresiones regulares no se puede utilizar en este caso. –

Respuesta

14

No creo que haya nada incorporado para hacer esto (que es relativamente poco común). Esto debe hacerlo sin embargo:

public static String reverseCase(String text) 
{ 
    char[] chars = text.toCharArray(); 
    for (int i = 0; i < chars.length; i++) 
    { 
     char c = chars[i]; 
     if (Character.isUpperCase(c)) 
     { 
      chars[i] = Character.toLowerCase(c); 
     } 
     else if (Character.isLowerCase(c)) 
     { 
      chars[i] = Character.toUpperCase(c); 
     } 
    } 
    return new String(chars); 
} 

Tenga en cuenta que esto no hace el cambio de la configuración regional específica que String.toUpperCase/String.toLowerCase hace. Tampoco maneja caracteres que no sean BMP.

+0

Esto es casi exactamente lo que hace el código StringUtils de Apache Commons, en realidad, excepto que usan charAt() para obtener cada carácter en lugar de convertirlo a un conjunto y desde él. Además, también verifican isTitleCase() (y convierten a inferior). –

+1

@JacobM: ¿Cómo construyen la matriz al final? Me parece que ir a una matriz de caracteres, modificar en su lugar y luego construir una cadena al final es una de las maneras más eficientes de hacer este tipo de trabajo. –

+1

Parece que comienzan asignando un StringBuffer y añadiendo cada carácter convertido al búfer. Supongo que entonces la pregunta es si StringBuffer.toString es más o menos eficiente que el nuevo String (char []). No podría decírtelo. El código fuente está disponible en http://kickjava.com/src/org/apache/commons/lang/StringUtils.java.htm –

18

Apache Commons StringUtils tiene un método swapCase.

+1

Sus StringUtils es una de las mejores herramientas para manipular cadenas. – Trick

+0

1 para el sentido común – skaffman

+2

Adición de una dependencia a una biblioteca bastante grande para una sola función de complejidad muy limitada podría argumentar en contra. –

1

supongo que debe haber una manera de iterar a través de la cadena y voltear cada personaje

correcta. La clase java.lang.Character le proporciona debajo de cada uno el método isUpperCase() para eso. Pruébalo y utiliza los métodos toLowerCase() o toUpperCase() según el resultado. Adjunte el resultado de cada uno a un StringBuilder y debería estar bien.

+2

No hay necesidad de anexar a un StringBuilder - usted ya sabe exactamente qué tan grande será la salida, y puede hacerlo en una matriz en el lugar. –

+0

Eso es factible si no necesita manipularlo después. – BalusC

+2

Jon: si respetas las reglas específicas de la configuración regional, cambiar la caja de una cadena no mantiene necesariamente la longitud. P.ej. la mayúscula de "ß" es "SS" para configuraciones regionales alemanas. – jarnbjo

-1

que se dan cuenta de que el hilo dado es muy antiguo, pero hay una mejor manera de resolverlo:

class Toggle 
{ 
    public static void main() 
    { 
     String str = "This is a String"; 
     String t = ""; 
     for (int x = 0; x < str.length(); x++) 
     { 
      char c = str.charAt(x); 
      boolean check = Character.isUpperCase(c); 
      if (check == true) 
       t = t + Character.toLowerCase(c); 
      else 
       t = t + Character.toUpperCase(c); 
     } 
     System.out.println (t); 
    } 
} 
+0

Mejore fromatting: sangría correcta ... – DrKoch

+2

¿Le importaría explicar por qué esto es "mejor"? Es (* funcionalmente *) no (muy) diferente de [la respuesta ya aceptada] (http://stackoverflow.com/a/1729815/215042). Sin embargo, no utiliza una matriz de longitud fija o un generador de cadenas, por lo que su solución es, en ese sentido, aún peor debido a muchas más (re) asignaciones requeridas. Otra cosa es que estás introduciendo un 'cheque 'variable que, al menos, no es muy descriptivo. También; es una cuestión de estilo/gusto, pero si dependiera de mí, escribiría 'if (Character.isUpperCase (c))' en lugar de asignar primero 'check' y luego verificar la variable ... – RobIII

0

También podemos utilizar un objeto StringBuilder, ya que cuenta con métodos de sustitución de caracteres. Sin embargo, podría tomar algo más de espacio almacenar el objeto StringBuilder. Por lo tanto, ayudará si el espacio no es importante y mantendrá la solución simple de entender.

String swapCase(String text) { 
    StringBuilder textSB = new StringBuilder(text); 
    for(int i = 0; i < text.length(); i++) { 
     if(text.charAt(i) > 64 && text.charAt(i) < 91) 
      textSB.setCharAt(i, (char)(text.charAt(i) + 32)); 
     else if(text.charAt(i) > 96 && text.charAt(i) < 123) 
      textSB.setCharAt(i, (char)(text.charAt(i) - 32)); 
    } 
    return textSB.toString(); 
} 
1

Basado en el enfoque de Faraz, creo que la conversión de caracteres puede ser tan simple como:

t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c); 
Cuestiones relacionadas