Autor Tema: Java código método función obtener posición numérica de palabra en frase o texto  (Leído 3880 veces)

programacion2019

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Hola muy buenas, tengo este ejercicio:

Programa que lea una frase y una palabra y que nos diga la posición de dicha palabra en la frase y si no la encuentra devuelva un cero.

Y el código que llevo hasta ahora es:

Código: [Seleccionar]
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner teclado = new Scanner(System.in);
String insertaPalabra;
String insertaFrase;

System.out.println("Dime una frase");
insertaFrase = teclado.nextLine();

System.out.println("Dime una palabra");
insertaPalabra = teclado.nextLine();

for(int i=0; i < insertaFrase.length(); i++ ){

if (insertaFrase.charAt(i).equals(insertaPalabra)) {
System.out.println("La palabra que esta buscando es " + insertaPalabra);
System.out.println("La posicion de la palabra es " + i);
}
}
}

}

Mi problemas está en el IF, que no sé cómo conseguir que se comparen ambas variables, agradezco ayuda, ¡¡gracias!!
« Última modificación: 05 de Agosto 2020, 18:47 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Comparar método String
« Respuesta #1 en: 26 de Octubre 2019, 21:46 »
Buenas, mírate el hilo https://aprenderaprogramar.com/foros/index.php?topic=1460.0 donde se dan unas indicaciones para escribir en los foros (cómo poner título a los temas, cómo pegar código, etc.).

En este hilo tienes un código para comparar palabras: https://aprenderaprogramar.com/foros/index.php?topic=2089.0

Ese hilo es un ejercicio del curso "Aprender programación Java desde cero" disponible en https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Supongo que hay varias maneras de hacerlo. La que estoy pensando ahora mismo es que dada una frase como "La mañana está muy fría" lo primero que habría que hacer es separar las palabras. Para esta frase, habría que extraer:

palabra[0] sería "la"
palabra[1] sería "mañana"
palabra[2] sería "está"
palabra[3] sería "muy"
palabra[4] sería "fría"

Lo he puesto en forma de array, pero igualmente podrían ser elementos de otro tipo de colección como un ArrayList.

Una vez tengas las palabras separadas, puedes recorrer cada elemento y hacer la comparación de la forma en que se hace en el ejercicio que he comentado.

Salu2

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Comparar método String
« Respuesta #2 en: 26 de Octubre 2019, 21:52 »
Hola, creo que no lo estás enfocando bien.

El enunciado dice que ha de "retornar" la posición de la palabra en la frase.

Yo ahí interpreto dos cosas:
1) En realidad lo que hay que hace es un método/función que retorne un valor int.
2) Ese valor int, no es la posición del carácter de la palabra que buscamos, sino la posición de la palabra.

Supón esta frase:
"Esto es una frase para hacer pruebas"
Y esta palabra:
"para"

Esa palabra ocupa la posición 5 dentro de la frase:
1ª es "Esto"
2ª es "es"
3ª es "una"
4ª es "frase"
5ª es "para"
6ª es "hacer"
7ª es "pruebas"

Así que nuestro método/función ha de recibir la frase y la palabra. Y ha de retornar un int con la posición, en este caso, sería el valor 5.

Repito, eso es lo que yo creo entender.
Así que  tendríamos que escribir un programa que tenga y utilice dicha función.

El quid de la cuestión es como resolverá nuestra función esto que nos piden.
Bien, hay una forma muy sencilla si conocemos bien los métodos de la clase String

Uno de sus muchos métodos, es el método split(), quien permite dividir un String en varios String, según el valor que le pasemos entre paréntesis.
En nuestro caso, si le pasamos un espacio en blanco --> split(" "), lo que hará será separar String que contiene la frase, en varios String conteniendo cada uno una palabra de dicha frase.
Estos String nos los devuelve juntos y ordenados en un array de String.
Así que tan solo tendríamos que recorrer el array, comparar cada String con la palabra que buscamos y si alguno coincide, devolvemos su posición + 1.

Si no encontramos ninguna coincidencia, pues devolvemos el valor 0.

Código: [Seleccionar]
public class BuscaPalabra {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
String insertaPalabra;
String insertaFrase;

System.out.println("Dime una frase");
insertaFrase = teclado.nextLine();

System.out.println("Dime una palabra");
insertaPalabra = teclado.nextLine();

System.out.println("Esa palabra está en la posición: " + posicionPalabra(insertaFrase, insertaPalabra));
teclado.close();
}

public static int posicionPalabra(String frase, String palabra) {

//Con split obtenemos un array con todas las palabras separadas
String[] palabras = frase.split(" ");

//Recorremos array, si alguna palabra coincide, esa será la posicion
for (int i = 0; i < palabras.length; i++) {
if (palabras[i].equals(palabra))
return i+1;
}

//si el bucle no ha hecho un return, es que no ha encontrado la palabra
return 0;
}

}

Esto es resolverlo apoyándonos en un método perteneciente a la API de Java.
Es correcto usarlos, pues para eso están.

Sin embargo, cuando estamos aprendiendo probablemente se espera que resolvemos los ejercicios por nuestros propios medios.

Se puede hacer sin usar split(). Es más complejo y engorroso.
Habría que recorrer la frase carácter a carácter, buscar uno que coincida con el primer carácter de nuestra palabra.
Cada vez que encontremos uno, tendremos que comprobar el resto de caracteres a ver si coinciden.
Si coinciden todos, hemos encontrado la palabra. Si no, pues hay que seguir buscando.
Pero, ¿y como sabemos en que número de palabra nos encontramos?
Podemos hacerlo contando los espacios en blanco que podamos ir encontrando.

Es decir, si durante la búsqueda no hemos encontrado ningún espacio en blanco --> (espaciosContados = 0) podemos suponer que estamos en la primera palabra.
Si espacios Contados = 1, seguramente es que estamos ya en la segunda palabra, etc...

Te dejo el mismo programa, pero esta vez con las dos funciones y mostrando en pantalla el resultado de ambas, a ver si coinciden.

Código: [Seleccionar]
public class BuscaPalabra {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
String insertaPalabra;
String insertaFrase;

System.out.println("Dime una frase");
insertaFrase = teclado.nextLine();

System.out.println("Dime una palabra");
insertaPalabra = teclado.nextLine();

System.out.println("Solucion usando split()");
System.out.println("Esa palabra está en la posición: " + posicionPalabra(insertaFrase, insertaPalabra));
System.out.println("----");
System.out.println("Solucion buscando caracteres mediante bucles");
System.out.println("Esa palabra está en la posición: " + posicionPalabra2(insertaFrase, insertaPalabra));
teclado.close();
}

public static int posicionPalabra(String frase, String palabra) {

//Con split obtenemos un array con todas las palabras separadas
String[] palabras = frase.split(" ");

//Recorremos array, si alguna palabra coincide, esa será la posicion
for (int i = 0; i < palabras.length; i++) {
if (palabras[i].equals(palabra))
return i+1;
}

//si el bucle no ha hecho un return, es que no ha encontrado la palabra
return 0;
}

public static int posicionPalabra2(String frase, String palabra) {
//contando espacios en blanco en la frase, podemos suponer en que palabra nos encontramos
int espaciosContados = 0;

/*
* Recorremos cada caracter.
* Si es un espacio en blanco, lo contamos.
* Si es un caracter que coincide con el primer caracter de
* nuestra palabra, habrá que comprobar el resto de caracteres
* a ver si coinciden todos.
*/
for (int i = 0; i < frase.length(); i++) {
if (frase.charAt(i) == ' ') //Es un espacio en blanco
espaciosContados++;
else {
/*
* No es un espacio en blanco.
* Comprobamos si este caracter coincide con
* el primer caracter de nuestra palabra
*/
if (frase.charAt(i) == palabra.charAt(0)) {
//¡¡Coincide!!. Recorremos el resto de caracteres a ver si tenemos la palabra completa.
boolean coincide = true;
for (int j = 1; j < palabra.length(); j++) {
if (frase.charAt(i+j) != palabra.charAt(j))
coincide = false; //¡Oh! Un caracter no ha coincidido, no es nuestra palabra
}
//Si coincide == true, nuestra búsqueda ha finalizado
if (coincide)
return espaciosContados + 1;
//Si coincide == false, no hacemos nada, dejamos que el bucle siga buscando.
}
}
}

//Bucle no ha hecho return, porque no ha encontrado la palabra
return 0;
}

}

Esto nos da este resultado en pantalla:

Citar
Dime una frase
Esta frase es para hacer pruebas
Dime una palabra
hacer
Solucion usando split()
Esa palabra está en la posición: 5
----
Solucion buscando caracteres mediante bucles
Esa palabra está en la posición: 5


Parece que todo es correcto.
Sin embargo, nuestra segunda función es propensa a errores.
Fíjate lo que ocurre si usamos otra frase distinta:
Citar
Dime una frase
El paraguas se usa para la lluvia
Dime una palabra
para
Solucion usando split()
Esa palabra está en la posición: 5
----
Solucion buscando caracteres mediante bucles
Esa palabra está en la posición: 2

¡¡Oh no!!
La segunda función se equivoca, piensa que la palabra "para" está donde está la palabra "paraguas". Menudo error.

Este error se puede corregir, tan solo hay que pedirle a la función que haga una comprobación extra antes de dar por buena la palabra encontrada.
¿Se te ocurre cuál puede ser?

Intenta entender todo el ejercicio e intenta averiguar como corregir este fallo. Si no lo consigues, ya te lo diré.
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

 

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".