Cadenas en JAVA

Respuesta de
a
Usuario
Hola soy Antonio.
Estoy haciendo una aplicación y me he atascado en una cosilla... os pongo un ejemplo simple de lo que quiero hacer.

Yo recibo un String que contiene palabras
String inicial="uno dos tres cuatro cinco seis siete ocho nueve diez" ;
En mi aplicación son frases por lo que serían más largas.
Lo que yo quiero hacer es buscar si una palabra esta entre las que tiene ese String y poder poner un entero que me deje mostrar las POR palabras anteriores y posteriores a la que yo busco.
Es decir, si llamo a un supuesto método o función buscar(cinco, 2); me debería mostrar "tres cuatro cinco seis siete" y el cinco me gustaría que saliera marcado (no se si existe Highlighter en JAVA) en algún color...
Lo que intento es "imitar" un poco la búsqueda de google que buscas una serie de palabras y los resultados te muestran en negrita las palabras que has buscado y te muestran una serie de palabras que hay por delante y por detrás.
¿Alguien sabe como podría hacerlo?
Un cordial saludo
Avatar
Experto
Hola,
lo que pides no parece muy complicado. Tardaría algo más en hacer todo el código, así que te diré las pistas y para hacerlo en plan pseudocódigo:
1) Para empezar lo mejor es usar el método "split" de String.
Inicial.split(" "); -> Esto te devolverá un array de Strings (String[]) con las palabras. Separa el string segun el espacio en blanco. Se pueden añadir cosas como comas o puntos también.

2) Ahora buscamos la palabra concreta. Podemos recorrer el array, cuando la encontremos ya tenemos su posición y solo nos haría falta coger las N anteriores (mientras indice > 0) y las N siguientes (mientras indice < length)  (N es el numero pedido)
3) Lo de marcar la palabra elegida ya no lo entiendo muy bien. Eso ya no es cosa de Java y depende de cómo estés haciendo la aplicación. Si es una aplicación web solo tendrías que introducir antes y después de la palabra elegida : < b > y </ b >, para que salga en negrita. O algún otro tag para cambiarla de color. Si estás sacando los resultados por pantalla no va a haber colores o negrita en eso... por pantalla puedes ponerla en Mayúsculas como mucho... (.toUpperCase() )

Espero que sea lo que buscas.
Un saludo
Avatar
Experto
Hola, si se solucionó el problema o no tienes más consultas cierra la pregunta, gracias.
Usuario
Hola
No he finalizado la pregunta porque estuve probando la solución que me diste y me funciona bien... obteniendo la posición de la palabra a buscar luego son coger los sucesores y los antecesores...
Pero me surge un problemilla...
Si en vez de buscar por ejemplo "cinco" tengo busco("cinco seis", 2); me debería de devolver " tres cuatro CINCO SEIS siete ocho".

Lo de resaltar la palabra buscada me tocará hacerlo en HTML o algo así visto que en java no se puede... si no lo consigo la opción de ponerlo en negrita o mayúsculas me puede valer.
Un cordial saludo
Avatar
Experto
Hola,
si en la búsqueda se permite introducir varias palabras no es problema. Haces el "split" también en la cadena de búsqueda. Entonces buscas la primera palabra de las de búsqueda (o única si solo busca una), si la encuentra comparas las siguientes del texto con las siguientes de la búsqueda (si las hay) y si coinciden ya coges las por anteriores y posteriores a todas.
Pseudo-código:
String[] palabras_texto  = texto.split(" ");
String[] palabras_busqueda = busqueda.split(" ");
boolean encontrado = false;
int posPrimera =0;
int posUltima =0;
if (palabras_busqueda.length!=0) {
String primera  = palabras_busqueda[0];
for (int i=0;i
<palabras_texto;i++){
if (palabras_texto[ i ].equals(primera){
encontrado = true;
int j = 0;
if (palabras_busqueda.length>1){
// Este bucle vale para buscar una o varias palabras seguidas
for (int j =1;j<palabras_busqueda.length;j++) if (! palabras_texto[ i+j].equals(palabras_busqueda[ j ]) encontrado = false;
}
if (encontrado){
posPrimera = i;
posUltima = i+j;
i=palabras_texto.length; // Terminamos de buscar
}
}

}//for
} //if

// Al terminar tenemos la posición de la primera palabra buscada en posPrimera y la ultima buscada en posUltima (si solo es una palabra valdrán lo mismo). Ahora cogeríamos por antes de la primera y por después de la ultima (si es posible).
//Si no se ha encontrado el booleano será falso.
Esto debería valer. El código no está probado pero es más o menos sencillo.
Un saludo
Usuario
Hola
MUCHAS GRACIAS tras varios intentos y alguna que otra línea chapucera que he de optimizar y ordenar ya me funciona perfectamente.
Un cordial saludo