Autor
|
Tema: [RESUELTO] Desesperado...{pasar una frase a un array, una palabra por poscion} (Leído 9,410 veces)
|
|Miguel|
Desconectado
Mensajes: 217
|
Hola, buenas a todos.. Bien, empecé hace una semanita en Java y hay un ejercicio de clase que no soy capaz de resolver. No quiero la respuesta, quiero entender por qué falla mi código y una orientación para ir adelante, un empujoncito. Bien ahí van el enunciado y mi ridículo código... XD Hacer un vector que guarde una frase, de forma que cada palabra ocupe una posición, y luego las mostramos una por línea. Sin espacios.package ejercicio021; import java.util.Scanner; public class Ejercicio021 { public static void main (String[] args ) { //Hacer un vector que guarde una frase, de forma que cada palabra //ocupe una posición, y luego las mostramos una por línea. Sin espacios. int i, pos_espacio=0, palabras=0 , prim=0; Scanner s =new Scanner (System. in); System. out. println("Introduzca frase:"); frase=s.nextLine(); frase=frase.trim(); do{ //este bucle sirve para contar las palabras que tiene la frase y hacer un array con las posiciones justas if ( frase.indexOf(" ", pos_espacio)>0 || frase.length()>0 ) palabras++; pos_espacio=frase.indexOf(" ", pos_espacio)+1; //System.out.println(palabras + " " +espacios+" "+pos_espacio); //La línea de arriba es solo para comprobar que iba bien. }while(pos_espacio>0); //********************************************************************* //System.out.println("Palabras: "+palabras); pos_espacio=frase.indexOf(" ", 0)+1; //y a partir de aquí nada funciona.. for(i=0; i<palabras; i++){ System. out. print("i="+i +" prim="+prim +" pos_espacio="+pos_espacio +"--"); vector[i]=frase.substring(prim, pos_espacio-1); prim=pos_espacio; pos_espacio=frase.indexOf(" ", pos_espacio+1)+1; System. out. println(vector [i ]); } }
Para la frase Hoy es miércoles obtengo el siguiente resultado: run: Introduzca frase: Hola hoy es miércoles. i=0 prim=0 pos_espacio=5--Hola i=1 prim=6 pos_espacio=9--oy i=2 prim=10 pos_espacio=12--s Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -14 at java.lang.String.substring(String.java:1938) at ejercicio021.Ejercicio021.main(Ejercicio021.java:26) i=3 prim=13 pos_espacio=0--Java Result: 1
|
|
« Última modificación: 21 Octubre 2011, 19:27 pm por |Miguel| »
|
En línea
|
|
|
|
Valkyr
Desconectado
Mensajes: 646
Divide y vencerás
|
Si en el ejercicio no te pone ninguna limitación podrías hacer uso del método split() de la clase String. La cosa sería, lees la cadena de teclado guardandola en un String, aplicas el método split() que te devuelve un array de cadenas. El parametro de la función es una expresión regular. El código que te propongo sería algo así: String linea = escaner. nextLine(); linea = linea.trim(); String[] vector = linea. split(" +");
Luego recorres ese array y listo. El parámetro (" +") representa uno o más espacios, por tanto, aunque las palabras estén separadas por muchos espacios en cada posición del array solo tendrás una cadena de caracteres. El error me imagino que te lo da por hacer esto: (" ", pos_espacio+1)+1, estás avanzando siempre un caracter, en algún momento te saltas alguna palabra, llegas antes al final, te devuelve -1 e intentas acceder con un -1 en la función substring. Saludos.
|
|
|
En línea
|
|
|
|
|Miguel|
Desconectado
Mensajes: 217
|
me gusta bastante esa solución, aunque no hemos visto en clase el método split() y supongo que el profesor querrá que lo hagamos a mano. Intentaré eso a ver que me sale, gracias EDITO: aunque voy a seguir investigando con split, he conseguido hacerlo funcionar de la otra forma. efectivamente el error venía por que en la ultima palabra me iba de rango e intentaba acceder a posiciones de string que no existían. esta es la corrección: package ejercicio021; import java.util.Scanner; public class Ejercicio021 { public static void main (String[] args ) { //Hacer un vector que guarde una frase, de forma que cada palabra //ocupe una posición, y luego las mostramos una por línea. Sin espacios. int i, j, pos_espacio=0, palabras=0 , prim=0; Scanner s =new Scanner (System. in); System. out. println("Introduzca frase:"); frase=s.nextLine(); frase=frase.trim(); do{ if ( frase.indexOf(" ", pos_espacio)>0 || frase.length()>0 ) palabras++; pos_espacio=frase.indexOf(" ", pos_espacio)+1; //System.out.println(palabras + " " +espacios+" "+pos_espacio); //La línea de arriba es solo para comprobar que iba bien. }while(pos_espacio>0); //********************************************************************* //System.out.println("Palabras: "+palabras); pos_espacio=frase.indexOf(" ", 0)+1; if (palabras==1) vector[0]=frase; else for(i=0; i<palabras; i++){ //System.out.println("i="+i+" prim="+prim+" pos_espacio="+pos_espacio+"--"); //comprobaciones vector[i]=frase.substring(prim, pos_espacio-1); prim=pos_espacio; if(frase.indexOf(" ", pos_espacio)!=-1) pos_espacio=frase.indexOf(" ", pos_espacio+1)+1; else pos_espacio= frase.length()+1; } for(i =0; i <palabras ; i ++) System. out. println(vector [i ]); } }
por cierto, vuestros códigos aparecen con colores y el mio no, ¿usais una etiqueta distinta de 'code', o lo haceis a mano?
|
|
« Última modificación: 20 Octubre 2011, 14:29 pm por |Miguel| »
|
En línea
|
|
|
|
s00rk
Desconectado
Mensajes: 195
|
Para que la sintaxis resalten, solamente en la etiquetra code agregale =lenguaje, ejemplo code=java , claro en los corchetes n_n Sobre el trabajo pues si como dice Valkyr , usando el metodo split de la Clase String te ayuda y reduce bastante todo jeje Scanner leer = new Scanner (System. in); System. out. println("Frase: "); String frase = leer. nextLine(); String [] arr = frase. split(" +");
|
|
|
En línea
|
|
|
|
|Miguel|
Desconectado
Mensajes: 217
|
No entiendo ese for. He hecho una version con split, y da un pequeño fallo. De momento os dejo esto aqui, hasta que la corrija. En esta versión, he puesto un array no dinámico porque no tenía mucho tiempo y me es más rápido, pero eso es cojer la parte de contar palabras de abajo y darle al array ese tamaño. public static void main (String[] args ) { Scanner s =new Scanner (System. in); System. out. print("Introduce frase: "); frase=s.nextLine(); miArray=frase.split(" +"); for(int i=0; i<50; i++){ System. out. println(miArray [i ]); } }
run: Introduce frase: hola pepe viñuelas Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 hola pepe vi�uelas at javaapplication1.JavaApplication1.main(JavaApplication1.java:16) Java Result: 1 BUILD SUCCESSFUL (total time: 6 seconds)
|
|
« Última modificación: 21 Octubre 2011, 19:29 pm por |Miguel| »
|
En línea
|
|
|
|
Valkyr
Desconectado
Mensajes: 646
Divide y vencerás
|
No necesitas crear una nueva instancia del array, el propio método split te devuelve el objeto ya instanciado. El bucle for que dices que no entiendes es un bucle "for each" es decir, para cada uno de los elementos del array hacer...lo que sea. Te dejo una referencia a Wikipedia por si quieres echar un vistazo: http://en.wikipedia.org/wiki/Foreach_loop#JavaBasandome en tú código y con la modificación que te he dicho quedaría así: public static void main (String[] args ) { Scanner s =new Scanner (System. in); System. out. print("Introduce frase: "); frase=s.nextLine(); miArray=frase.split(" +"); for(String palabra : miArray ){ } }
Saludos.
|
|
|
En línea
|
|
|
|
|Miguel|
Desconectado
Mensajes: 217
|
Vale, si no uso las funciones como hay q usarlas normal q no me salgan las cosas Muchas gracias. Lo del for each es bastante interesante, no sabía que existía.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Restar una palabra a una frase enviada por winsock
Programación Visual Basic
|
Snort
|
4
|
2,199
|
14 Octubre 2006, 18:54 pm
por Snort
|
|
|
Eliminar una palabra que esta despues de una frase?
.NET (C#, VB.NET, ASP)
|
<housedir>
|
2
|
3,293
|
19 Agosto 2013, 03:00 am
por Eleкtro
|
|
|
Batch. Encontrar palabra en frase
Scripting
|
Stealt
|
4
|
5,296
|
30 Agosto 2013, 07:29 am
por Eleкtro
|
|
|
Ayuda .bat que copie una palabra o frase al portapapeles
Scripting
|
mundomadelman
|
3
|
8,126
|
2 Octubre 2014, 21:42 pm
por Eleкtro
|
|
|
Contar cuantas veces aparece una palabra en una frase
Scripting
|
minikarpin
|
2
|
3,837
|
16 Marzo 2017, 04:58 am
por Eleкtro
|
|