elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 23:45  


Tema destacado: ¡Aprende hacking con práctica! - WarZone, el wargame de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java (Moderadores: Debci, Leyer)
| | | |-+  [RESUELTO] Desesperado...{pasar una frase a un array, una palabra por poscion}
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [RESUELTO] Desesperado...{pasar una frase a un array, una palabra por poscion}  (Leído 828 veces)
|Miguel|

Desconectado Desconectado

Mensajes: 182



Ver Perfil
[RESUELTO] Desesperado...{pasar una frase a un array, una palabra por poscion}
« en: 19 Octubre 2011, 20:10 »

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.

Código
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);
       String frase=new String();
       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);
       String vector[]=new String[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:
Citar
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 por |Miguel| » En línea
Valkyr


Desconectado Desconectado

Mensajes: 632


Divide y vencerás


Ver Perfil
Re: Desesperado...{pasar una frase a un array, una palabra por poscion}
« Respuesta #1 en: 19 Octubre 2011, 23:11 »

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í:

Código
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 Desconectado

Mensajes: 182



Ver Perfil
Re: Desesperado...{pasar una frase a un array, una palabra por poscion}
« Respuesta #2 en: 19 Octubre 2011, 23:15 »

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:
Código
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);
       String frase=new String();
       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);
       String vector[]=new String[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 por |Miguel| » En línea
s00rk

Desconectado Desconectado

Mensajes: 139



Ver Perfil
Re: Desesperado...{pasar una frase a un array, una palabra por poscion}
« Respuesta #3 en: 20 Octubre 2011, 00:20 »

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
Código
		Scanner leer = new Scanner(System.in);
System.out.println("Frase: ");
String frase = leer.nextLine();
String [] arr = frase.split(" +");
for(String palabra: arr)
System.out.println(palabra);
 
En línea

|Miguel|

Desconectado Desconectado

Mensajes: 182



Ver Perfil
Re: Desesperado...{pasar una frase a un array, una palabra por poscion}
« Respuesta #4 en: 21 Octubre 2011, 19:27 »

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.
Código
public static void main(String[] args) {
       String frase=new String();
       Scanner s=new Scanner(System.in);
       System.out.print("Introduce frase: ");
       frase=s.nextLine();
 
       String []miArray=new String[50];
       miArray=frase.split(" +");
 
       for(int i=0; i<50; i++){
           System.out.println(miArray[i]);
       }
   }

Cita de: NetBeans
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 por |Miguel| » En línea
Valkyr


Desconectado Desconectado

Mensajes: 632


Divide y vencerás


Ver Perfil
Re: [RESUELTO] Desesperado...{pasar una frase a un array, una palabra por poscion}
« Respuesta #5 en: 21 Octubre 2011, 21:44 »

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#Java

Basandome en tú código y con la modificación que te he dicho quedaría así:

Código
public static void main(String[] args) {
       String frase=new String();
       Scanner s=new Scanner(System.in);
       System.out.print("Introduce frase: ");
       frase=s.nextLine();
 
       String []miArray;
       miArray=frase.split(" +");
 
       for(String palabra : miArray){
           System.out.println(palabra);
       }
   }

Saludos.
En línea

|Miguel|

Desconectado Desconectado

Mensajes: 182



Ver Perfil
Re: [RESUELTO] Desesperado...{pasar una frase a un array, una palabra por poscion}
« Respuesta #6 en: 22 Octubre 2011, 12:23 »

Vale, si no uso las funciones como hay q usarlas normal q no me salgan las cosas  :xD

Muchas gracias. Lo del for each es bastante interesante, no sabía que existía.
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda para pasar un array que esta en ARGV[] a un array INTEGER..
Programación General
nitr0us 7 1,998 Último mensaje 18 Febrero 2004, 17:23
por zheo
Pasar variables a un Array
Desarrollo Web
ayabass 0 287 Último mensaje 10 Diciembre 2004, 20:06
por ayabass
Restar una palabra a una frase enviada por winsock
Programación Visual Basic
Snort 4 365 Último mensaje 14 Octubre 2006, 18:54
por Snort
pasar caracteres a un array
Programación C/C++
andaluz 2 707 Último mensaje 19 Marzo 2010, 18:36
por Didacso
Seleccionar aleatoriamente una palabra de un array en C
Programación C/C++
folostia 1 572 Último mensaje 21 Diciembre 2011, 17:19
por Eternal Idol
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines