Java - No se porque me da excepcion ArrayIndexOutOfBoundsException

   
Vista:

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Rafa (13 intervenciones) el 18/11/2015 20:44:54
Hola muy buenas,
Estoy realizando un ejercicio con ArrayList , y la verdad es que ni siquiera me muestra el contenido del fichero desde donde cojo los datos. Me dice algo del tamaño del array , pero yo creo que todo esta correcto. Pongo el código para ver si alguien me puede ayudar. la excepción que me muestra es :
java.lang.ArrayIndexOutOfBoundsException: 1
at Pais.leer(Pais.java:121)
at Pais.main(Pais.java:171)

Este el el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import java.util.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
 
public class Pais {
	private String codCir;
	private String codCol;
	private String codPart;
	private int votP1;
	private int votP2;
	private int votP3;
	private int votP4;
	private int votBlanco;
	private int votNulos;
	ArrayList<Pais>colegios=new ArrayList<Pais>();
 
 
//Introducimos y sacamos la Circunscripcion
public void setCodCir (String codCir){
	this.codCir=codCir;
}
 
public String getCodCir(){
	return codCir;
}
 
//Introducimos y sacamos el colegio
public void setCodCol (String codCol){
	this.codCol=codCol;
}
 
public String getCodCol(){
	return codCol;
}
 
//Introducimos y sacamos el Partido Político
public void setCodPart (String codPart){
	this.codPart=codPart;
}
 
public String getCodPart(){
	return codPart;
}
 
//Introducimos y sacamos los votos del Partido 1
public void setVotP1(int votP1){
	this.votP1=votP1;
}
 
public int getVotP1(){
	return votP1;
}
 
 
//Extraemos los votos del Partido2
public void setVotP2(int votP2){
	this.votP2=votP2;
}
 
public int getVotP2(){
	return votP2;
}
 
//Extraemos los votos del Partido3
public void setVotP3(int votP3){
	this.votP3=votP3;
}
 
public int getVotP3(){
	return votP3;
}
 
//Extraemos los votos del Partido4
public void setVotP4(int votP4){
	this.votP4=votP4;
}
 
public int getVotP4(){
	return votP4;
}
 
//Extraemos los votos en blanco
public void setVotBlanco(int votBlanco){
	this.votBlanco=votBlanco;
}
 
public int getVotBlanco(){
	return votBlanco;
}
 
//Extraemos los votos Nulos
public void setVotNulos(int votNulos){
	this.votNulos=votNulos;
}
 
public int getVotNulos(){
	return votNulos;
}
 
//Método para leer los archivos de los colegios
public void leer (String archivo) {
	Scanner s=null;
	File fichero=new File(archivo);
	try{
		//FileReader fr=new FileReader(fichero);
	    //BufferedReader bf= new BufferedReader(new FileReader(fichero));
		s= new Scanner(fichero);
		while (s.hasNextLine()){
			String linea= s.nextLine();
			String [] cortarString=linea.split("	");
 
			Pais apartado=new Pais();
			apartado.setCodCir(cortarString[0]);
			apartado.setCodCol(cortarString[1]);
			apartado.setCodPart(cortarString[2]);
			apartado.setVotP1(Integer.parseInt(cortarString[3]));
			apartado.setVotP2(Integer.parseInt(cortarString[4]));
			apartado.setVotP3(Integer.parseInt(cortarString[5]));
			apartado.setVotP4(Integer.parseInt(cortarString[6]));
			apartado.setVotBlanco(Integer.parseInt(cortarString[7]));
			apartado.setVotNulos(Integer.parseInt(cortarString[8]));
 
			colegios.add(apartado);
 
		}
 
	}catch(Exception e){
		System.out.println("El fichero no existe o no se ha podido abrir");
		e.printStackTrace();
	}finally{
		try{
			if(s!=null){
				s.close();
			}
		}catch(Exception e2){
			System.out.println("El fichero esta vacio, no contiene nada");
			e2.printStackTrace();
		}
	}
System.out.println("Guardados "+ colegios.size() +" ficheros");
}
 
public void mostrarContenido(){
	Iterator<Pais>itrColegios=colegios.iterator();
	while(itrColegios.hasNext()){
		Pais apartado=itrColegios.next();
		System.out.println("***");
		System.out.println(apartado.getCodCir()+"---");
		System.out.println(apartado.getCodCol()+"---");
		System.out.println(apartado.getCodPart()+"---");
		System.out.println(apartado.getVotP1()+"---");
		System.out.println(apartado.getVotP2()+"---");
		System.out.println(apartado.getVotP3()+"---");
		System.out.println(apartado.getVotP4()+"---");
		System.out.println(apartado.getVotBlanco()+"---");
		System.out.println(apartado.getVotNulos()+"***");
	}
 
}
 
public static void main (String [] args){
	System.out.println("******Bienvenido al programa de recuento electoral*********");
	Pais a=new Pais();
	a.leer("/Users/rafa/Documents/proyectos android unir/Elecciones/ficheros/sevilla.txt");
	a.mostrarContenido();
}
 
}


Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Jose (6 intervenciones) el 18/11/2015 21:42:46
Podrías poner una de las líneas del fichero porque el error parece ser que esta en la inicialización del objeto apartado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Lawliet (236 intervenciones) el 18/11/2015 22:44:33
Hola...

El error se debe a que andas haciendo referencia a un indice en tu arreglo que no existe; es decir, tenemos una lista con un total de 5 elementos, por lo tanto los indices correspondientes a esta lista son 0, 1, 2, 3, 4, tenemos que recordar que los indices en programación siempre empiezan desde el 0, si nosotros hacemos referencia a un indice que no existe por ejemplo 5, entonces obtendremos el error que tu puedes ver en tu aplicación.

Por lo que veo el error radica en estas líneas de código, quiero creer que el split no devuelve mas que solo un único indice, el 0.

1
2
3
4
String [] cortarString=linea.split("	");
Pais apartado=new Pais();
apartado.setCodCir(cortarString[0]);
apartado.setCodCol(cortarString[1]);

Mi recomendación es que verifiques que el caracter a separar sea varios espacios así como la misma cantidad de espacios, ya que por lo que tu necesitas puede ocasionar errores con un solo espacio que falte, te explico.

1
2
3
4
5
6
String enunciado = "Lind     L     Taylor";
String[] palabras = enunciado.split("     ");
 
System.out.println(palabras[0]);
System.out.println(palabras[1]);
System.out.println(palabras[2]);

Con el código anterior tenemos como separador un total de 5 espacios entre cada palabra, por lo tanto podemos obtener la siguiente salida sin problema alguno, ya que al tener la misma cantidad de espacios podemos saber que como respuesta debemos tener un arreglo con 3 posiciones.

1
2
3
Lind
L
Taylor

Sin embargo, si nosotros agregamos una cuarta palabra con un total de 4 espacios, prácticamente esto ya no es funcional para nuestro split debido a que como separador tenemos definido que sea un total de 5 espacios y no de 4.

1
2
3
4
5
6
7
String enunciado = "Lind     L     Taylor    Lawliet";
String[] palabras = enunciado.split("     ");
 
System.out.println(palabras[0]);
System.out.println(palabras[1]);
System.out.println(palabras[2]);
System.out.println(palabras[3]);

Esto nos generara el error que tu puedes observar en pantalla.

LindException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.alberto.codigos.main.Ejercicio.main(Ejercicio.java:11)


Por que quieres acceder a una palabra que no existe y es que si lo llevamos a descripción gráfica, veríamos el siguiente resultado.

1
2
3
4
palabras[0] = Lind
palabras[1] = L
palabras[2] = Taylor    Lawliet
palabras[3] = No existe (ERROR)

El indice 3 no existe debido a que entre Taylor y Lawliet solo existe una separación de 4 espacios y no de 5 espacios como hemos definido en nuestro split.

Mi consejo, revises la cantidad de espacios que separan tus palabras o bien, cambia el separador.

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Rafa (13 intervenciones) el 19/11/2015 00:23:01
Gracias por la respuesta a los dos, tenia como separación en la función split() un tabulador, pero he probado poniendo "::" y sigue dando el mismo problema. Finalmente le he dejado 3 espacios pero sigue fallando, os adjunto uno de los ficheros para ver si podéis ver algo más. Precisamente os quería comentar si voy bien encaminado. Mi intención es leer de más de un archivo ubicados en un directorio, guardarlos en un ArrayList y posteriormente mostrar el partido que más votos a sacado, realizando la suma de uno de los campos , tanto por CodCir, como en general.

Acabo de probar a poner un solo campo de votos, ya que el archivo tiene 4 campos:CodCir, CodCol,CodPart y VotP1 y sigue dandome el mismo problema.

Espero podais ayudarme tanto en el fallo, como en la resolución.

Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Jose (6 intervenciones) el 19/11/2015 01:27:28
A ver, tal como lo tienes ahora mismo el problema está en el formato en que presentas la información en los ficheros y la forma en que intentas leerlos. El bucle while te va leyendo línea por línea, cada línea la estas partiendo por los espacios y cargas los siguientes datos para cada objeto:

+ CÓDIGO CIRCUNSCRITO
+ CÓDIGO DEL COLEGIO
+ CÓDIGO DEL PARTIDO -> (Aquí no se a qué partido te refieres).
+ VOTOS PARA EL PARTIDO 1 -> (Supongamos que siempre será el PP el partido 1 para facilitar el problema)
+ VOTOS PARA EL PARTIDO 2 -> (Supongamos que siempre será el PSOE el partido 2 para facilitar el problema)
+ VOTOS PARA EL PARTIDO 3 -> (Supongamos que siempre será PODEMOS el partido 3 para facilitar el problema)
+ VOTOS PARA EL PARTIDO 4 -> (Supongamos que siempre será CIU el partido 4 para facilitar el problema)
+ VOTOS EN BLANCO
+ VOTOS NULOS

Entonces siguiendo este esquema, cada línea de nuestro fichero deberá contener TODOS los valores señalados antes. Un ejemplo sería:

Cataluña::NombreDelColegio::ElCodigodePartidoQueNoEntiendo::50::20::25::50::40::2


OJO: He usado los :: porque me parece más fácil usarlos de separadores que los espacios.

Ahora bien, para tu problema, esta forma de inicializar el ArrayList te resultará un ArrayList unidimensional donde las j primeras posiciones pertenezcan a un código circunscrito, luego las k siguientes siendo k = j+1 posiciones pertenecerán a otro código circunscrito y así hasta el final. Puede que te sea mas interesante usar un ArrayList bidimensional.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Lawliet (236 intervenciones) el 19/11/2015 19:13:05
Hola...

En primer lugar es importante aclararte algunas cosas.

1.- El tipo Archivo DS_STORE, lo tienes en ambos directorios por lo que sino estas validando que tu aplicación lea únicamente los Documentos de texto (.txt), desde ahí estamos equivocados ya que tu aplicación leerá todo archivo que se encuentra en tu carpeta. Esto mismo se aplica para cuando tienes una carpeta dentro de otra carpeta. En resumen, tu aplicación debe estar preparada únicamente para leer archivo de texto plano solamente.

Captura1
Captura2

2.- En la carpeta __MACOSX/ficheros, tienes los archivos ._barcelona.txt y ._tarragona.txt pero si los abrimos podemos ver que el contenido de ambos archivos no tiene nada legible debido a que tiene alguna especie de encriptado.

Captura3

3.- Tienes N cantidad de archivos a leer, sin embargo, debes observar que de todos los archivos que tienes no todos cumplen con la forma en que vas a separar. Viendo los 4 archivos que tienes podemos decir que 2 tienen la misma estructura y 2 tienen la misma estructura, barcelona.txt y tarragona.txt, tienen el mismo patrón en su contenido.

Captura4

Ambos tienen separadores de 3 espacios por lo que estoy seguro que si solamente lees estos 2 archivos en tu código no deberías tener problemas cuando hagas un split de 3 espacios.

Mientras que los archivos huelva.txt y sevilla.txt tienen la siguiente estructura en su interior.

Captura5

Si te das cuenta las primeras líneas no tienen nada que ver con lo que tu tienes definido en el split, por lo tanto no puedes esperar que sean separadas por nuestro método debido a que no cumplen con nuestro separador; es decir, con los 3 espacios, por lo que puedo decirte con toda seguridad que el error se encuentra en esta falta de estándares en tus archivos.

Mi consejo es que estandarices un poco tus archivos para que no tengas inconvenientes de lectura, sin embargo, te proporciono un código sencillo el cual puede servirte como ayuda y evitar ese molesto error.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class LecturaArchivos {
	public static void main(String[] args) throws Exception {
		// Recursos para lectura de archivos.
		FileReader fr = null;
		BufferedReader br = null;
		// Ruta de archivos a leer.
		File file = new File("C:\\Users\\Quality\\Downloads\\ficheros");
		// Arreglo con los nombres de los archivos en la carpeta.
		String[] archivos = file.list();
		// Recorremos el arreglo para obtener cada uno de los nombres.
		for(int i = 0; i < archivos.length; i++){
			// Validamos que únicamente tome los archivos con terminación txt.
			if(archivos[i].endsWith("txt")){
				// Armamos la ruta completa con el nombre del archivo.
				String nombre = file.toString() + "\\" + archivos[i];
				// Instanciamos nuestros recursos a leer.
				fr = new FileReader(nombre);
				br = new BufferedReader(fr);
				String linea = "";
				// Leemos las líneas del archivo.
				while((linea = br.readLine()) != null){
					// Si la línea leída contiene el separador "   ", entonces realizamos el split.
					if(linea.contains("   ")){
						String[] cadenas = linea.split("   ");
						System.out.println(cadenas[0]);
						System.out.println(cadenas[1]);
						System.out.println(cadenas[2]);
						System.out.println(cadenas[3]);
					}
				}
			}
		}
	}
}

Prácticamente con el código anterior hacemos una especie de parche; es decir, leemos tus archivos tal y como los tienes pero solo aplicamos el split a aquellos elementos que cumplan con nuestras condiciones; es decir, que tengan el separador de nuestro split.

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Rafa (13 intervenciones) el 20/11/2015 00:26:22
Muchas gracias por contestar a los dos, he resuelto el problema de formato de mis archivos y efectivamente había error en los dos acrhivos de Andalucia, creo que el textedit me la jugó y los guardo como formato rtf. He visto el método que me hebeis dejado de ejemplo para leer todos los ficheros que haya en un directorio y la verdad que lo veo muy util, y no sabía que existiera. Lo pondré en práctica, aunque sigo con mi problema.

Al final deje un único campo de votos logicamente, y no sé como hacer para realizar la suma de los campos VotP1 de todos los objetos que se van añadiendo a mi ArrayList. No se si me he explicado , la aplicación básicamente tiene que leer todos los ficheros , contabilizar el número de votos de los partidos y dar un partido ganador, tanto por Circunscripcion, como por Pais en general. Yo he intentado añadir en el main() un objeto diferente por cada archivo leido, pero no me ha funcionado.
Declarando tanto el ArrayList con el arreglo, como static

int suma=a.colegios.get(0,cortarString[3]) + a.colegios.get(1,cortarString[3]);

Perdonad mi ignorancia pero sou novato y voy dando un poco palos de ciego. En cuanto al arrayList multidimensional, no se como sería. Existen? o habría que crear dos ArrayList. Bueno espero podais ayudarme y no abusar de vuestra bondad.

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Jose (6 intervenciones) el 20/11/2015 01:34:31
Buenas,

A ver si puedo ayudarte jejeje.

Supongo que lees todos los ficheros que desees por ejemplo Cadiz, Barcelona y Tarragona (en ese orden). Entonces en tu ArrayList de colegios estarán primero los colegios de Cádiz, luego los de Barcelona y luego los de Tarragona.

Cada colegio tendrá en votP1, votP2, votP3 y votP4 los votos de cada partido.

Ahora bien si queremos calcular la suma total de votos por código circunscrito, crearía un método al que le paso el Código Circunscrito que quiero saber, recorrería el ArrayList de colegios y si el código circunscrito del colegio de la posición i se corresponde con el código que recibí pues sumaría los votos de ese colegio al recuento. ¿Dónde sumaría esos votos? En un ArrayList de 4 posiciones, en la posición 0 guardaría la suma de votosP1, en la posición 1 guardaría la suma de votosP2 y así sucesivamente.

Tras recorrer todo los colegios del código que me han dado, recorro el ArrayList con la suma de votos y selecciono el máximo así sabría qué partido ganó.

Por otro lado, para saber los votos de cada partido en todo el país seguiría una estrategia parecida a la anterior. Creo un ArrayList de 4 posiciones, en la posición 0 guardaría la suma de votosP1, en la posición 1 guardaría la suma de votosP2 y así sucesivamente.
Recorro el ArrayList de colegios pero ahora no compruebo nada sino que simplemente le hago getVotP1, getVotP2, getVotP3 y getVotP4 y los voy sumando a las correspondientes posiciones del ArrayList resultado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Lawliet (236 intervenciones) el 20/11/2015 04:06:27
Hola...

No entendí muy bien que es lo que te propones, lo único que logre entender es que necesitas la suma de los votos por cada archivo o eso es lo que quiero entender. El código que te proporcionare a continuación almacena toda la información de los archivos en una lista del tipo País, además te proporciono los archivos para que veas la estructura que manejan en su interior.

Pais.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Pais {
	private String codCir;
	private String codCol;
	private String codPart;
	private int vot;
 
	public Pais() {}
 
	public Pais(String codCir, String codCol, String codPart, int vot) {
		this.codCir = codCir;
		this.codCol = codCol;
		this.codPart = codPart;
		this.vot = vot;
	}
 
	public String getCodCir() {
		return codCir;
	}
 
	public void setCodCir(String codCir) {
		this.codCir = codCir;
	}
 
	public String getCodCol() {
		return codCol;
	}
 
	public void setCodCol(String codCol) {
		this.codCol = codCol;
	}
 
	public String getCodPart() {
		return codPart;
	}
 
	public void setCodPart(String codPart) {
		this.codPart = codPart;
	}
 
	public int getVot() {
		return vot;
	}
 
	public void setVot(int vot) {
		this.vot = vot;
	}
}

Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ArchivosPaises {
	public static void main(String[] args) throws Exception {
		List<Pais> listaPais = new ArrayList<Pais>();
		FileReader fr = null;
		BufferedReader br = null;
		File file = new File("C:\\Users\\Quality\\Downloads\\ficheros");
		String[] archivos = file.list();
		for(int i = 0; i < archivos.length; i++){
			if(archivos[i].endsWith("txt")){
				String nombre = file.toString() + "\\" + archivos[i];
				fr = new FileReader(nombre);
				br = new BufferedReader(fr);
				String linea = "";
				while((linea = br.readLine()) != null){
					String[] cadenas = linea.split("   ");
					Pais pais = new Pais(cadenas[0], cadenas[1], cadenas[2], Integer.parseInt(cadenas[3]));
					listaPais.add(pais);
				}
			}
		}
	}
}

Si nosotros hacemos un recorrido a nuestra lista, a través del siguiente código, se obtiene la salida que se muestra más adelante.

1
2
3
for(Pais valor : listaPais){
	System.out.println(valor.getCodCir() + "\t" + valor.getCodCol() + "\t" + valor.getCodPart() + "\t" + valor.getVot());
}

Output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Cataluña	Barcelona	psoe	200
Cataluña	Barcelona	PP	10
Cataluña	Barcelona	CIU	700
Cataluña	Barcelona	Podemos	500
Cataluña	Barcelona	Blanco	100
Cataluña	Barcelona	Nulos	120
Andalucia	Huelva	psoe	200
Andalucia	Huelva	PP	180
Andalucia	Huelva	CIU	250
Andalucia	Huelva	Podemos	187
Andalucia	Huelva	Blanco	24
Andalucia	Huelva	Nulos		34
Andalucia	Sevilla	psoe	500
Andalucia	Sevilla	PP	550
Andalucia	Sevilla	CIU	700
Andalucia	Sevilla	Podemos	400
Andalucia	Sevilla	Blanco	80
Andalucia	Sevilla	Nulos	90
Cataluña	Tarragona	psoe	120
Cataluña	Tarragona	PP	15
Cataluña	Tarragona	CIU	400
Cataluña	Tarragona	Podemos	347
Cataluña	Tarragona	Blanco	5
Cataluña	Tarragona	Nulos	6

Como podrás darte cuenta, ya tenemos toda nuestra información dentro de una lista, prácticamente si lo que necesitas es realizar una suma de los valores solo es cuestión de agruparlos de la forma correcta para proceder con la suma y así obtener la sumatoria correcta. Por lo que entendí necesitas la suma total por cada archivo; es decir, barcelona, huelva, sevilla y tarragona, con el código que te eh proporcionado solamente sería cuestión de sumar los valores correspondientes de cada País.

Sin más que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!

P.D. Te recomiendo no trabajes con ñ o acentos, ya que al mostrarlos por consola se mostraran como un carácter raro como puedes ver en mi salida cuando recorro la lista.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Rafa (13 intervenciones) el 24/11/2015 00:07:37
Muy buenas,

Gracias por contestar a los dos, al final solo use una varible para todos los votos José, en lugar de usar una variable de votos por cada partido. Lawlie he utilizado tu método para leer todos los ficheros de un directorio(hasta ahora desconocia que se pudiera hacer), en cuanto a la finalidad del ejercicio, no es obtener el número total de votos por cada fichero, sino que hay que dar un partido ganador por cada circunscripción , por ejemplo, recorro mi ArrayList, selecciono todos los votos de Cataluña del PSOE(fichero de Barcelona y Tarragona), sumo los votos que tenga y los comparo con los que se han obtenido por los otros partidos realizando la misma operación. Además de esto hay que calcular el ganador de la votación por país, es decir, sumar todos los votos de cada partido de mi ArrayList, compararlos y declarar un ganador.

No se si me he explicado bien, hay que dar un ganador por cada circunscripción, y el vencedor general del país. Como me habeis indicado yo recorro el ArrayList, selecciono una circunscripcion y un partido e intento sumar los votos, pero se ve que aunque el código no me genera ningún error, también es cierto que no me hace nada. Quizas estoy ignorando algún método de los arrayList que se utilice para esto, espero podáis ayudarme nuevamente. Os dejo como tengo el código actualmente, la idea es hacer lo mismo para cada partido y circunscripción , pero como no he dado con la tecla no he seguido. Saludos y gracias


import java.util.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;

public class Pais {
private String codCir;
private String codCol;
private String codPart;
private int votP1;
ArrayList<Pais>colegios=new ArrayList<Pais>();
static String [] cortarString;


//Introducimos y sacamos la Circunscripcion
public void setCodCir (String codCir){
this.codCir=codCir;
}

public String getCodCir(){
return codCir;
}

//Introducimos y sacamos el colegio
public void setCodCol (String codCol){
this.codCol=codCol;
}

public String getCodCol(){
return codCol;
}

//Introducimos y sacamos el Partido Político
public void setCodPart (String codPart){
this.codPart=codPart;
}

public String getCodPart(){
return codPart;
}

//Introducimos y sacamos los votos del Partido 1
public void setVotP1(int votP1){
this.votP1=votP1;
}

public int getVotP1(){
return votP1;
}



//Método para leer los archivos de los colegios
public void leer (String archivo) {
Scanner s=null;
File fichero=new File(archivo);
String[] archivos= fichero.list();
try{
for(int i=0;i<archivos.length;i++){
if(archivos[i].endsWith("txt")){
String nombre= fichero.toString() + "//" + archivos[i];
FileReader fr= new FileReader(nombre);
BufferedReader bf= new BufferedReader(fr);
String linea;
while ((linea=bf.readLine())!=null){
cortarString=linea.split(" ");
Pais apartado=new Pais();
apartado.setCodCir(cortarString[0]);
apartado.setCodCol(cortarString[1]);
apartado.setCodPart(cortarString[2]);
apartado.setVotP1(Integer.parseInt(cortarString[3]));
colegios.add(apartado);
}
}
}
}catch(Exception e){
System.out.println("El fichero no existe o no se ha podido abrir");
e.printStackTrace();
}finally{
try{
if(s!=null){
s.close();
}
}catch(Exception e2){
System.out.println("El fichero esta vacio, no contiene nada");
e2.printStackTrace();
}
}
System.out.println("Recogidos "+ (colegios.size()/6) +" ficheros\n");

for(Pais recorre : colegios){
System.out.println(recorre.getCodCir() + "\t" + recorre.getCodCol() + "\t" + recorre.getCodPart() + "\t" + recorre.getVotP1());
}
}

public void mostrarContenido(){
Iterator<Pais>itrColegios=colegios.iterator();
while(itrColegios.hasNext()){
Pais apartado=itrColegios.next();
System.out.println("***");
System.out.println(apartado.getCodCir());
System.out.println(apartado.getCodCol());
System.out.println(apartado.getCodPart());
System.out.println(apartado.getVotP1());
}

}

public void resultados(){
int suma=0;
for(Pais recorre:colegios){
if((recorre.getCodCir()=="Catalunia") && (recorre.getCodPart()=="psoe")){
suma=recorre.getVotP1();
suma++;
System.out.println ("Los votos totales del PSOE en Cataluña son:"+suma);
}
}
}


public static void main (String [] args){
System.out.println("******Bienvenido al programa de recuento electoral*********\n");
Pais a=new Pais();
System.out.println("****Este es el fichero general de votaciones en todo el pais****\n");
a.leer("/Users/rafa/Documents/proyectos android unir/Elecciones/ficheros");
a.resultados();

}

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Jose (6 intervenciones) el 24/11/2015 00:56:45
1
2
3
4
5
6
7
8
9
10
public void resultados() {
	int suma=0;
	for(Pais recorre:colegios){
		if((recorre.getCodCir()=="Catalunia") && (recorre.getCodPart()=="psoe")){
			suma=recorre.getVotP1();
			suma++;
			System.out.println ("Los votos totales del PSOE en Cataluña son:"+suma);
		}
	}
}

En este código estas recogiendo los votos del partido psoe de los colegios de cataluña los guardas en la variable suma y luego incrementas suma en 1. Por ejemplo:

Para cualquier colegio de cataluña recogeríamos los votos del psoe y pongamos que fuesen 200, suma tomaría este valor y luego se incrementaría en 1 tomando como resultado final suma = 201. Y ahora lo imprimes por pantalla.

/-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------/
La forma de calcular una suma total recorriendo un array normalmente se hace de la siguiente forma:

1
2
3
4
5
6
7
8
public void resultados() {
	int suma=0;
	for (ArrayList o lo que sea a recorrer){
		// Operaciones que hagan falta.
		suma += Lo que se quiera sumar.
	}
	Mostramos la suma.
}

Ahora bien, tendrás que buscar una forma de hacer que tu función te sirva para todas las provincias y para todos los partidos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Rafa (13 intervenciones) el 24/11/2015 13:01:39
Gracias Jose, lo aplicaré y lo de la función para que sirva para los diferentes partidos la realizaré, por ejemplo, con diferentes if. Lo malo que tal y como te he puesto en el código de antes no entra en if((recorre.getCodCir()=="Catalunia") && (recorre.getCodPart()=="psoe")) , ya que le he colocado un prontln justo después del if y no me lo imprime. No me da ningún error de compilación pero no llega a entrar en el bucle, algo debo estar poniendo mal, pero no se que.


Saludos y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Jose (6 intervenciones) el 24/11/2015 17:57:52
Para comparar Strings en java se usa el método equals() no el signo == prueba con eso yo supongo que ese es el fallo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Lawliet (236 intervenciones) el 24/11/2015 18:34:23
Hola...

Java a diferencia de otros lenguajes de programación interpreta un String como un Wrapper (Tipo de variable con la capacidad de adquirir métodos, en resumen, un Objeto), por lo tanto, tratarlo como Primitivo (Tipo de variable que carece de métodos) es caer en un error común.

Al entender que String viene siendo un Objeto, nosotros debemos tratarlo como tal, por lo tanto, hacer comparaciones con el tradicional == o != es totalmente erróneo. Para ello Java nos proporciona un método el cual nos permite comparar objetos entre sí, equals(), el cual viene equivaliendo a un == pero aplicado para objetos.

Te proporciono el código base para tu ejercicio.

1
2
3
4
5
6
7
8
9
10
11
12
13
int sumaCatalunia = 0;
int sumaAndalucia = 0;
 
for(Pais recorre : listaPais){
	if((recorre.getCodCir().equals("Catalunia")) && (recorre.getCodPart().equals("psoe"))){
		sumaCatalunia += recorre.getVot();
	} else if((recorre.getCodCir().equals("Andalucia")) && (recorre.getCodPart().equals("psoe"))){
		sumaAndalucia += recorre.getVot();
	}
}
 
System.out.println("Suma Total (Cataluña): " + sumaCatalunia);
System.out.println("Suma Total (Andalucia): " + sumaAndalucia);

No tengo mucho que explicar ya que es un código sumamente sencillo, lo único que debes recordar es al momento de comparar cadenas; es decir, String.

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No se porque me da excepcion ArrayIndexOutOfBoundsException

Publicado por Rafa (13 intervenciones) el 09/12/2015 02:21:14
Muchas gracias a los dos, al final he conseguido terminar la actividad. Me faltan algunos flecos , pero donde me había quedado atascado me habéis ayudado mucho.

Mil gracias, saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar