Autor Tema: java buscar y reemplazar cadenas análisis expresiones regulares diptongos acento  (Leído 2552 veces)

Cris SG

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola buen dia a todos ;D, espero que me puedan ayudar con un problema que me ha confundido bastante pero también tengo algo de código, solo que no puedo pasar de allí.

Comento que tambien le cuesta a mi lap procesar, si me pueden comentar alguna forma de optimizar el progama se lo agradeceria, trabajo en NetBeans

El problema es el siguiente:

Leer una cadena de texto, el programa deberá

•   Identificar si la cadena es nula y marcar error ( Es decir solo se dio ENTER )
•   Buscar los diptongos en la cadena y colocar * antes y después del diptongo encontrado.
•   Si se encuentran acentos en la cadena, remplazarlos con  una Diagonal ´/´
•   Los espacios se remplazan por ‘_ _’
•   Si los espacios exceden en mas uno entre palabra y palabra se deberán quitar. ( ej. Hola       a       todos.       Hola a todos.

Parte del código que tengo:

Código: [Seleccionar]
public class HelloWorld{
   
     public static void main(String []args){
       
        StringBuilder CadenaUsuario=new StringBuilder();
       

        // -- Pedir la cadena y guardar en CadenaUsuario
       
        CadenaUsuario.append("Mi cadena a revisar");
       
        System.out.println(isNull(CadenaUsuario));
       
        if (isNull(CadenaUsuario) ){
            System.out.println("La cadena es vacia");
        }else{
           
           
        }
       
     }
     
     public static StringBuilder diptongos (StringBuilder cadena){
         
          String[ ] vocales = {"a", "e","i","o","u"};
          StringBuilder aux = new StringBuilder();
         
          for (int i = 0 ; i<= cadena.lenght(); i++){
              try{
                 
              }
              catch(){
                 
              }
          }
         
          return cadena;
         
         
     }
     
     public static  boolean isNull (StringBuilder cadena){
         
         if (cadena.length() >1) {
             return false;
         }else{
             return true;
         }
         
     }//end of isnull
     }//end of class

El apartado que no comprendo para nada es el de diptongos D:, intento hacerlo me manda errores de logica, espero que me puedan ayudar, de antemano muchas gracias por el tiempo prestado
« Última modificación: 02 de Abril 2021, 21:24 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Tema: Remplazo y búsqueda en cadena
« Respuesta #1 en: 17 de Diciembre 2020, 02:42 »
Hola y bienvenido.

En los métodos donde se van a modificar las cadenas, está bien usar StringBuilder porque seguramente vamos a seguir un proceso donde vamos a reconstruir una cadena haciendo la modificaciones que nos piden, por ejemplo, insertar asteriscos allá donde encontremos un diptongo.

Pero la cadena original sobre la que se va a trabajar no es necesario que sea StringBuilder.
Podría serlo, pero diría que es más correcto que sea un String normal.

La cadena original se supone que se ha de pedir al usuario por teclado, pero ahora mismo es más cómodo hacer pruebas con una cadena ya escrita en el código.
Lo de pedir cadena por teclado lo dejaría para el final, cuando todo lo demás esté terminado.

Sobre encontrar diptongos, te voy a proponer un código para resolverlo.
No es la única forma de hacerlo y de hecho seguramente hay formas más sencillas de hacerlo utilizando algunos métodos que ofrece la clase String como el replace() y/o usando expresiones regulares (no importa si no sabes lo que son, ya llegarás a ellas cuando toque)

Pero la forma que propongo, digamos que es un poco más "artesanal", es usando lógica creada por nosotros y no lógica que ya venga programada de serie por otros.


Lo primero es saber qué es un diptongo.
Un diptongo es cuando en una palabra encontramos dos vocales juntas, y una de ellas o ambas, es una vocal débil (Vocales débiles son : i, u)

Así que vamos a tener que recorrer la cadena original, letra a letra, buscando vocales.
Por tanto, para facilitar la tarea, nos vendría bien un método que nos diga si un carácter (una letra) es vocal o no.
Por ejemplo, este método:
Código: [Seleccionar]
private static boolean esVocal(char caracter) {
switch(caracter) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
return true;
default:
return false;
}
}
Es muy sencillo, si el caracter es a,e,i,o,u.. retorna TRUE.
Si es CUALQUIER otra cosa, retorna FALSE.

Bien, además de esto, nos puede interesar otro método que nos diga si el caracter que recibe, es una vocal débil o no.
Por ejemplo:
Código: [Seleccionar]
private static boolean esDebil(char caracter) {
if (caracter == 'i' || caracter == 'u')
return true;
else
return false;
}

Es tan sencillo que no requiere explicación.
Fíjate que son porciones de código muy simples, y casi podríamos pensar que para tan poca cosa, no vale la pena crear métodos.
Pero lo cierto es que esto luego ayudará a que el código que escribamos después, sea más sencillo de leer y de entender.

Y ahora vamos con el método diptongos()
Haremos un método que reciba un String con la cadena original,y retornará otro String nuevo, con las modificaciones que hayan sido necesarias hacer en la cadena original.

Estas modificaciones van a consistir en señalar con asteriscos los diptongos que pueda contener esa cadena.

La lógica a seguir será:
- Iniciar un StringBuilder

- Recorrer cada carácter de la cadena original con un bucle e ir añadiéndolos al StringBuilder, intercalando asteriscos en caso de encontrar diptongos.

- Al seleccionar un carácter, comprobamos si es vocal.
   Si no es vocal, no hacemos nada, lo añadimos al StringBuilder y pasamos al siguiente
   Pero si es vocal, entonces tenemos que seleccionar también el siguiente carácter.

- Si el siguiente carácter NO es vocal, tampoco hacemos nada. Lo ignoramos y añadimos la vocal seleccionada al StringBuilder.
  Pero, si el siguiente carácter SI es vocal, ahora tenemos que comprobar si una de estas vocales, o ambas, son DÉBILES.

- Si ninguna es débil, no hacemos nada. Ignoramos la vocal siguiente y añadimos la vocal actual al StringBuilder.
   Pero, si una o ambas son DÉBILES, entonces al StringBuilder añadimos un asterisco, luego las dos vocales, y por último otro asterisco, quedando así señalizado el diptongo.
   Además, en este caso, debemos hacer un incremento extra en el indice del bucle que recorre las letras, porque ya hemos comprobado y seleccionado la letra actual y la siguiente.
Así que el indice del bucle ha de hacer doble incremento para no que no seleccione el carácter siguiente al actual, ya que ambos ya han sido comprobados.

Este sería el código:
Código: [Seleccionar]
public static String diptongos(String cadena){

/*
* Un DIPTONGO es cuando se juntan una vocal fuerte y una débil,
* o bien dos vocales débiles.
* Así que buscaremos caracteres que sean VOCALES.
* Al encontrar una VOCAL, comprobaremos el carácter siguiente.
* Si también es VOCAL, comprobaremos si una de ellas,
* o ambas, son débiles, en cuyo caso tendremos un DIPTONGO
*/
StringBuilder aux = new StringBuilder();
char caracter = ' ';

//Comprobaremos todos los caracteres, uno a uno
try {
for (int i = 0 ; i < cadena.length(); i++){
//Cogemos un caracter de la cadena
caracter = cadena.toLowerCase().charAt(i);
//comprobamos si es vocal
if (esVocal(caracter)) {
//Es vocal, comprobemos siguiente caracter
char siguiente = cadena.toLowerCase().charAt(i+1);
if (esVocal(siguiente)) {
/*
* Si alguno de estos caracteres, o ambos,
* son vocales DÉBILES, entonces tenemos
* un DIPTONGO
*/
if (esDebil(caracter) || esDebil(siguiente)) {
//Es DIPTONGO, añadimos caracteres rodeados de asteriscos
aux.append('*');
aux.append(cadena.charAt(i));
aux.append(cadena.charAt(i+1));
aux.append('*');
/*
* Como ya hemos comprobado este caracter y el siguiente,
* aumentamos indice del bucle para evitar volver a comprobar
* el siguiente caracter
*/
i++;
}
else //No hay diptongo, agregamos caracter sin hacer nada
aux.append(cadena.charAt(i));
}
else //Segundo caracter no es vocal, añadimos primer caracter sin hacer nada
aux.append(cadena.charAt(i));
}
else //Primer caracter no es vocal, agregamos caracter sin hacer nada
aux.append(cadena.charAt(i));
}
}
catch(IndexOutOfBoundsException ex) {
/*
* Hemos intentado acceder a una posición de la cadena
* que está fuera de rango.
* Esto ocurrirá cuando el último carácter de la cadena es vocal
* y queremos comprobar el siguiente carácter para ver
* si hay diptongo, pero como ya estamos en el último
* no hay un caracter siguiente.
*
* En este caso, lo único que tenemos que hacer
* es agregar este último carácter al StringBuilder sin hacer nada
* más.
*/
aux.append(cadena.charAt(cadena.length() - 1 ));
}

//Retornamos el StringBuilder, convertido en un String "normal"
return aux.toString();
}
Parece que hay mucho código, pero es por los comentarios.
Si los quitas, verás que en realidad son unas pocas líneas y que además son muy legibles gracias a los dos métodos que hemos escrito previamente.

Ahora, vamos preparar el método main() para poner a prueba este método.

Como dije, mejor usar un String normal y además ya escrito en el código para agilizar las pruebas.
Interesa que primero se muestre la cadena original, y luego se vaya mostrando de nuevo sucesivamente cada vez que se le haga modificaciones.

Código: [Seleccionar]
public static void main(String []args){

// -- Pedir la cadena y guardar en CadenaUsuario

String cadenaUsuario = "Ejemplos de DIPTONGOS: piensa, reino, puesto, pausa";

if (isNull(cadenaUsuario) ){
System.out.println("La cadena es vacia");
}else{
System.out.println("Cadena original:");
System.out.println(cadenaUsuario);

System.out.println("\n- Busqueda de DIPTONGOS:");
cadenaUsuario = diptongos(cadenaUsuario);
System.out.println(cadenaUsuario);
}

}

En este caso, veremos la cadena original, y luego la volveremos a ver con los diptongos señalizados con asteriscos.
En pantalla sale esto:

Código: [Seleccionar]
Cadena original:
Ejemplos de DIPTONGOS: piensa, reino, puesto, pausa

- Busqueda de DIPTONGOS:
Ejemplos de DIPTONGOS: p*ie*nsa, r*ei*no, p*ue*sto, p*au*sa

Parece que funciona correctamente  :)

Analiza bien el código que he propuesto. Comprueba que entiendes cada línea de código, intenta discernir por ti mismo lo que te pueda resultar extraño, por ejemplo por qué estoy usando el método .toLowerCase(). para seleccionar caracteres...

Y lo que no entiendas, no dudes en preguntarlo.

Y una vez lo entiendas, a ver si te sirve de inspiración para realizar el resto de cosas que pide el enunciado.
Si no, también te ayudaremos, no te preocupes.

Un saludo
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Cris SG

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re: Tema: Remplazo y búsqueda en cadena
« Respuesta #2 en: 18 de Diciembre 2020, 01:14 »
Increíble, estoy leyendo la lógica y me quedo sorprendido por qué no paso por qué cabeza algo así, estoy analizandolo aún y voy a hacer pruebas está noche por qué lo que necesito es muchas práctica.

También me parece interesante la cuestión de la función replace, no lo conocía pero también voy a probarlo en este problema, una forma debe existir.
Muchísima gracias por la ayuda, si me surge alguna otra la analizare mejor o pediré algún consejo nuevamente.
Muchas gracias, ahora es momento de trabajar 🤩

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".