lunes, 18 de julio de 2011

Manejo De Cadenas En Java, Operaciones Con Palabras

Muchas de las operaciones básicas con cadenas (String's) cuando estamos aprendiendo a programar son las operaciones con las palabras en una cadena, problemas como: contar cuantas palabras tiene una cadena, eliminar la k-ésima palabra, invertir todas las palabras, etc. Ahora mostraremos los algoritmos de problemas clásicos resueltos de una forma nativa, ya que sabemos que Java tiene una infinidad de métodos en la clase String para manejar cadenas, pero haremos uso de las 3 mas básicas que son:
  • length() retorna el numero de caracteres de una cadena (String)
  • charAt(posicion) retorna un carácter (char) de la posicion en la cadena.
  • substring(inicio, fin) retorna una subcadena extraída de una cadena dada la posición de inicio y fin.
Con estos métodos básicos podemos hacer cualquier operación con cadenas (String's) ademas de ayuda podemos utilizar también el método trim() que elimina todos los espacios (carácter espacio) de adelante y del final de una cadena.

Bien, ahora entremos en tema, lo primero que tenemos que saber es como detectar una palabra, de la forma mas sencilla una cadena puede ser "Hola amigos espero que estén bien" que tiene 6 palabras, ademas observen que tiene 5 caracteres espacio, entonces podríamos decir que para detectar palabras nos enfocaremos en los espacios.

Contar Cuantas Palabras Tiene Una Cadena

Si tenemos la cadena "Hola amigos espero que estén bien" tiene 5 espacios entonces que tal si contamos cuantos espacios existen y le sumamos uno, esa podría ser una solución correcta, pero para otras operaciones mas complejas se aconseja adicionar o concatenar un espacio mas al final de la cadena teniendo asi "Hola amigos espero que estén bien " entonces una vez concatenado contaremos los espacios y serán 6, que representa 6 palabras, el código Java es el siguiente.

public static int contarPalabras(String cadena) {
    cadena += " ";
    int c = 0;
    for (int i = 0; i < cadena.length(); i++) {
        if (cadena.charAt(i) == ' ') {
            c++;
        }
    }
    return c;
}

Eliminar La K-ésima Palabra De Una Cadena

Primero necesitamos una nueva cadena donde se ira almacenando la cadena menos la palabra a eliminar, entonces lo que tenemos que hacer es también almacenar palabra por palabra en una variable y esto para concatenar a la nueva cadena pero menos una (la que tenemos que eliminar) logrando asi que estén en la nueva cadena todas las palabras menos una, para ello tambien necesitamos contar cada vez que encontremos una palabra, el código Java es el siguiente.

public static String eliminarPalabra(String cadena, int k) {
    cadena += " ";
    String nuevaCadena = "";
    int c = 0;
    String palabra = "";
    for (int i = 0; i < cadena.length(); i++) {
        palabra += cadena.charAt(i);
        if (cadena.charAt(i) == ' ') {
            c++;
            if (c != k) {
                nuevaCadena += palabra;
            }
            palabra = "";
        }
    }
    return nuevaCadena.trim();
}

Invertir Las Palabras De Una Cadena

El truco para invertir una cadena es en la concatenación, la concatenación por izquierda, es decir si nosotros tenemos la cadena "abc" y hacemos la siguiente operación 'x' + "abc", tenemos "xabc" y así si extraemos carácter por carácter y lo concatenamos por izquierda ya tenemos la cadena invertida, lo mismo hay que hacer pero palabra por palabra, detectando palabras y almacenándolas inversamente y luego recien concatenar la palabra a la nueva cadena, el código Java es el siguiente.

public static String invertirPalabras(String cadena) {
    cadena += " ";
    String palabra = "";
    String nuevaCadena = "";
    for (int i = 0; i < cadena.length(); i++) {
        palabra = cadena.charAt(i) + palabra;
        if (cadena.charAt(i) == ' ') {
            nuevaCadena += palabra;
            palabra = "";
        }
    }
    return nuevaCadena.trim();
}

Como podemos ver también se utilizo la función trim() para eliminar los espacios sobrantes en las cadenas resultantes.


Nota. Este Post como todos del blog son actualizados constantemente, se añadirán mas funciones con palabras, para enterarte cuando hazte fan de la pagina de facebook y si quieres información basica de lo que son cadenas y conceptos de sintaxis en Java, descarga las diapositivas del curso Java.

    9 comentarios:

    1. muy buenos los aportes sobre Java..

      saludos y excelente blog..

      ResponderEliminar
    2. Escribo en este foro para pedir ayuda en un script Java que me permita resolver el siguinete problema de manejo de strings:

      Variable [texto]

      Si el string: [href="http://en.wikipedia.org/wiki/"] existe en la variable [texto] y si [href="http://en.wikipedia.org/wiki/] + los 5 caracteres siguientes es diferente a [href="http://en.wikipedia.org/wiki/File]

      Entonces: Remplaza todo lo que esta a la derecha de [href="] hasta ["] por [#]

      Si no: No hacer nada.

      El script tiene que hacer eso hasta que recorra toda la variable [texto].


      Saludos y gracias de ante mano por la buena voluntad

      ResponderEliminar
    3. QUE BUENA GRACIAS AHORA YA ENTIENDO

      ResponderEliminar
    4. amigo el metodo contar palabras tiene un error ya que cuando se presiona varias veces la barra espaciadora que son espacios obviamente, lo toma como palabras es decir
      ejemplo: lo que esciba entre comilla va ser el texto

      "hola como estan" --->aki me muestra que hay 3 palabras eso ta bn

      2)
      "hola mundo "---> aki me muestra como 40 palabras si puedes mejorarlo bn ya que ese codigo o metodo que hizo no es conveniente

      ResponderEliminar
      Respuestas
      1. see ejta mal ese ejercicio resolvelo no es complejo

        Eliminar
      2. bueno :) te paso el codigo correcto aunq se puede optimizar:
        public String contarPal( String cad){
        String A="";
        int c=0;
        for (int i = 0; i <cad.length(); i++) {
        if (cad.charAt(i)!=' '){
        A=A+cad.charAt(i);
        }else if (A!=""){
        c++;
        A="";
        }
        }
        if (A!=""){
        c++;
        }
        return A=Integer.toString(c);
        }

        Eliminar
    5. ta weno pero faltan mas ejercicios

      ResponderEliminar
    6. I am robert..Good work buddy... keep continuing... it shows yours commitment towards informatica field...

      ResponderEliminar

    Deja tu comentario, agradecimiento, sugerencia o critica.