problema con un ejercicio de java

Rubo

voy a ir por partes para que me podais ayudar mejor

  • el ejercicio dice asi: escribe un programa que pida dos cadenas por pantalla e indique si dichas cadenas tienen las mismas palabras aunque sea en distinto orden y repetidas un numero distinto de veces. Nota: habra que distinguir lo que son palabras recorriendo las cadenas. No se pueden utilizar funciones de libreria que faciliten esta labor.

bueno el ejercicio lo tengo claro y tal y supuestamente lo he terminado, pero me da un error al intentar comparar las palabras, que he metido en vectores.
os pego el codigo que tengo para que os podais aclarar, pongo en negrita el sitio donde me da el error, esta un poco desordenado pero bueno:

import java.io.*;
public class ejercicio34 {

public static void main(String[] args)throws IOException {
	InputStreamReader en = new InputStreamReader (System.in);
	BufferedReader entrada = new BufferedReader (en);
	
	String n;
	int longi;
	int i;
	char ch;
	int j=1;
	String b;


	System.out.println("dos frasecillas a comparar ");
	n = entrada.readLine();
	b=entrada.readLine();
	
	//primera frase//
	
	longi=n.length();
	for(i=longi-1;i>-1;i--) {
		ch=n.charAt(i);
		switch(ch) {
		case' ':
		j=j+1;
			break;

		default: 
			
			break;
		}
				
}

	int c=0;
	String[] v= new String[j];
	String cadena="";
	
	for(i=0;i<longi;i++) {
		ch=n.charAt(i);
		if (i==longi-1){
			
			cadena=cadena+ch;
			v[c]=cadena;
			c=c+1;
			cadena="";
		}else {
		switch(ch) {
		
			
		case' ':
			c=c+1;
			cadena="";
			break;

		default: 
			cadena=cadena+ch;
			v[c]=cadena;
			break;
/*finswitch*/		}
/*finelse*/		}	
			
/*finfor*/}
	
	// segunda frase //
	int h=1;
	int k= 0;
	
	longi=b.length();
	for(i=longi-1;i>-1;i--) {
		ch=b.charAt(i);
		switch(ch) {
		case' ':
		h=h+1;
			break;
		default: 
		
			break;
		}
				
}
	String[] w= new String[h];
	for(i=0;i<longi;i++) {
		ch=b.charAt(i);
		if (i==longi-1){
			
			cadena=cadena+ch;
			w[k]=cadena;
			k=k+1;
		}else {
		switch(ch) {
		case' ':
			k=k+1;
			cadena="";
			break;

		default: 
			cadena=cadena+ch;
		w[k]=cadena;
			break;
		}
		}	
			
}
	
	    // comparacion //
AQUI ES EL ERROR
String cadena1;
	String cadena2;
	int g;
	int z;
	for (g=0;g<=c ;g++){
		for (z=0;z<=h;z++){
		cadena1=v[g];
		cadena2=w[z];

		if (cadena1.equals(cadena2)){
			System.out.print("verdadero" );
			
		}else{
			System.out.print("falsoo" );

AQUI ACABA EL ERROR
/finelse/ }
/finfor/ }

	}

	//los dos ultimos
}

}

IS4kO

A parte de que no se si cierras bien los For.

Tienes que sacar el valor a comparar antes del segundo for, es decir

for i=0;i<y;i++
{
cadena1=matriz
for x=0;x<y;x++
{
cadena2=matriz2[x]
if cadena1=cadena2
{
....
}
}cierre del segundo for
}cierre del primero

Rubo

vale con la cadena1 se ha solucionado con lo que has dicho pero en la cadena2 no me deja hacer cadena2=w[z]; me da error del tipo java.lang.ArrayIndexOutOfBoundsException: 2

IS4kO

Ese error salta cuando estas intentando acceder a una posición que no existe en el array, es decir si el array es de 10 elementos estas intentando entrar al 14 por ejemplo.

Atendiendo a esto, piensa que cuando sales del segundo for Z vale la longitud del array, es decir el máximo, por lo que cuando entras por segunda vez este accede a una posición inexistente.

para solucionarlo, tras cadena1=array[Y] inicializa de nuevo la variable z a 0

Y recuerda que los arrays en JAVA empiezan desde el 0

:)

Rubo

lo se, por eso los indices del for empiezan en 0, pero aun asi el error persiste, no se por que, pero es como si no los tomara como numeros, en vez de poner en el array los indices del for meto numeros y asi no sale el error, no lo entiendo

edit: voy a probar eso que acabas de editar xD

edit2: no eso que dices no se contempla porque cuando vuelve a entrar en el for lo primero que se encuentra es que z=0 , de igual manera, lo que tu dices no sale. Java es un poco paranoico en tema de for siempre me salen cosas raras.
gracias por intentar ayudarme de todas formas

IS4kO

ummm no enteindo muy bien lo q dices, pero si lo has arreglado lpunto y pelota :p

Iwal no me he explicado bien sorry, para que te pille la inicialización en el for debes meter el:

for int i=0;i<93874;i++

que es como si la declararas de nuevo, si no lo pnes así Debe ir como te comentaba cada vez que sales de una iteración del primer for inicializas a 0 el indice de la segunda matriz.

Si aun haciendo eso te sigue entrando por el índice correcto y fallando, es que se pasa del tamaño de este, vete haciendo una impresión por cada vez que pasas por el for, y te saldra cuando se sale del rango. Yo nunca he oido que pasen cosas raras con los for en JAVA, debe ser algun detalle que te hallas dejado pasar

Rubo

ya lo he solucionado ... uff que tonto soy, el problema estaba en que hice el vector con una variable que tenia el un valor, por ejemplo 3 y en el vector era 0, 1 y 2 y claro esa misma variable la use en el for con lo cual se pasaba un lugar en el vector con lo cual restandole 1 se me ha solucionao.

PD: gracias por dedicarme tu tiempo

IS4kO

Pa eso estamos :)

gF

#7

No he compilado el código pero lo he ido siguiendo y he visto que el fallo se encuentra aquí:

for (g=0;g<=c ;g++){
for (z=0;z<=h;z++){

Tal como está se accede a una posición más de como fue creado el array, pero no hace falta restar como tu dices, simplemente cambiar <= por < , osea:

for (g=0;g<c ;g++){
for (z=0;z<h;z++){

Otra cosa, a ver si te acostumbras de poner nombres intuitivos a las variables. Yo por ejemplo pondria a j y h, numPalabras1 y numPalabras2 y a c y k numEspacios1 y numEspacios2. Entonces para que todo fuera correcto (tal como tu lo tienes al final las 4 variables toman el mismo valor) borraria la siguiente linea de codigo (señalada con una flecha):

if (i==longi-1){

cadena=cadena+ch;
v=cadena;
c=c+1; <--------
cadena="";

}else {
switch(ch) {

Y lo mismo para el mismo trozo pero con k. Esa suma es innecesaria, no aporta nada puesto que el numero de palabras ya lo tienes en otras variables (j y h) y si no la realizas lo que tienes es el numero de espacios (ya que numero de espacios = numero de palabras - 1)

Finalmente si me haces caso y cambias eso que te he dicho, date cuenta que tendrias que cambiar esto otra vez:

for (g=0;g<c ;g++){
for (z=0;z<h;z++){

que equivale a:

for (g=0;g<numEspacios1 ;g++){
for (z=0;z<numPalabras2;z++){

para que fuera correcto seria:

for (g=0;g<j ;g++){
for (z=0;z<h;z++){

o el equivalente:

for (g=0;g<numPalabras1 ;g++){
for (z=0;z<numPalabras2;z++){

Aparte de todo esto creo que tu codigo no hace lo que pide el enunciado del ejercicio ya que lo que tu haces es imprimir verdadero o falso para cada pareja de palabras que compara.

Ejemplo 1:

String1 - hola adios
String2 - adios hola hola hola

El resultado de esto seria "verdadero" ya que las palabras son las mismas aunque una se repita y esten en otro orden mientras que como tu lo tienes el resultado es (ojo, eso creo pq no lo he compilado), "falso verdadero verdadero verdadero verdadero falso falso falso".

Ejemplo2:

String1 - hola adios
String2 - adios hola uno

El resultado deberia ser simplemente "falso" pq uno no está en los 2 strings

Rubo

jaja ya se que no hace el enunciado del ejercicio, aun me falta un poco para acabarlo. Con respecto a lo de los nombres ... tienes razon, hasta yo me lio, lo que pasa esque esta bastante parcheado y creo que se nota bastante xD, lo de la c=c+1 y h=h+1 yo lo hice para poner la longitud del vector leyendo las palabras y que se quedara grabado en memoria. De todas formas lo que queda ya de ejercicio es mas sencillo de hacer, lo mas dificil de este ejercicio era leer las frases por palabras e ir guardandolas, y bueno el error que dices es verdad, al final me di cuenta antes de que postearas, aun asi gracias.

Usuarios habituales

  • Rubo
  • gF
  • IS4kO