Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Necesito algo de ayuda con los vectores de objetos

Vereis la teoria del ejercicio es sencilla en la clase principal creo un vector de objetos donde guardare la informacion de la nota y la asignatura del alumno, el codigo que tengo es el siguiente:
----------------------------------------------Principal:--------------------------------------------------
public static void main(String []args)throws IOException{
BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in));
Vector<Asignatura> materia=new Vector<Asignatura>();
Asignatura obs=new Asignatura();
String respuesta;
do{
System.out.println("¿Quieres añadir una asignatura?");
respuesta=teclado.readLine();
if(respuesta.equalsIgnoreCase("si")==false & respuesta.equalsIgnoreCase("no")==false){
System.out.println("La respuesta debe ser si o no");
}else if(respuesta.equalsIgnoreCase("si")){
System.out.println("Escribe el nombre de la asignatura");
obs.nombre=teclado.readLine();
System.out.println("Escribe la nota");
obs.nota=Double.parseDouble(teclado.readLine());
materia.add(obs);
}
}while(respuesta.equalsIgnoreCase("no")==false);
System.out.println("Los nombres introducidos son: ");
for(int i=0;i<materia.size();i++){
System.out.println(materia.elementAt(i));
}

-----------------------------------------------Asignatura------------------------------------------------
public class Asignatura {
String nombre;
double nota;
}

El problema es que muestra es:
Asignatura@7ffe01
Asignatura@7ffe01
No da fallos sintacticos, y algo debe de meter por que me da el mismo numero de lineas de fallo como nombres y notas introduzco, el problema es que en vez de mostrar los datos muestra lo, no se si es problema al meter los datos o al mostrarlos, alguien podria ayudarme por favor estoy desesperado ya y por internet no encuentro nada. Muchas gracias de antemano por vuestra ayuda.

febrero 29, 2012 | Registered Commenterobs1042

Los elementos de ese Vector son objetos de la clase Asignatura.
Si lo que quieres es que muestre las variables internas de esa clase, debes hacer referencia a ellas, de la misma manera en que lo haces cuando insertas datos.

En tu bucle final:

Asignatura asignatura= materia.elementAt(i);
System.out.println("Nombre: "+asignatura.nombre);
System.out.println("Nota: "+asignatura.nota);

Hay dos detalles adicionales, que te comento:
- Vector es una clase obsoleta; deberías usar ArrayList
- No es buena idea que los campos de una clase sean públicos; mejor hazlos privados, y usa métodos para leer y escribir en ellos.

febrero 29, 2012 | Registered Commenterchoces

Me acabo de dar cuenta de otro error en tu código, al ver que en la salida, las referencias de la clase Asignatura son idénticas.

Cuando se insertan instancias de una clase en una lista, no se puede crear una única instancia, y reutilizarla al añadirla a la lista, como haces, sino que debe crearse una nueva de cada vez. De otro modo, siempre estarás insertando la misma en cada posición de la lista, y sus datos internos serán los mismos, e iguales a los últimos que hayas actualizado.

Deberías mover la creación de la instancia
Asignatura obs=new Asignatura();
al interior del bucle do..while

febrero 29, 2012 | Registered Commenterchoces

Muchas gracias por la rapida contestacion!!otro fallo que tenia por si a alguien le sirve era que creaba el objeto fuera del bucle con lo que cuando introducia los datos lo que hacia el programa era introducir el ultimo las veces que hiciesen falta hasta rellenar todo el vector de objetos, lo he metido dentro del bucle y ay introduce todo bien.
La verdad es que es un gustazo que la gente coopere de esta forma y ayude a los que menos sabemos.
Por ultimo una ultima peticion a modo personal mas que de codigo, podrias decirme ¿por que es mejor usar arraylist que vector? no se yo usé vector por que es lo que al profesora nos ha explicado, si puedes decirme el motivo te lo agradeceria asi se lo digo a la profesora y empezamos a usar arraylist.
He encontrado por internet que vector tiene thread-safe y Arraylist no, y cuando el arraylist tiene que aumentar el tamaño para poner los datos aumenta su tamaño un 50% del que ya usa, el vector lo duplica.¿Hay alguna razon mas?

febrero 29, 2012 | Registered Commenterobs1042

Ups no vi tu ultimo comentario, nada mas ver el primero me puse a trastear y al final me acabe dando cuenta solo tambien de ese fallo :) gracias de todas formas:)

febrero 29, 2012 | Registered Commenterobs1042

La principal razón es que Vector siempre es thread-safe, incluso cuando no es necesario, mientras que ArrayList no lo es, por lo que si no se necesita acceder a un ArrayList desde diferentes threads, es más eficiente que Vector.

Ésto es lo que se afirma en el Javadoc del API de Vector:
"If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of Vector."

http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html

Por otra parte, siempre se puede hacer que una List sea thread-safe, cuando es inevitable, mediante el uso de utilidades como Collections.synchronizedList, o mediante implementaciones específicas thread-safe, como CopyOnWriteArrayList, al margen de que los accesos a las ArrayList también pueden hacerse de manera sincronizada.

Todo esto ha hecho que la utilidad de Vector haya caído en desuso, y aunque oficialmente no está obsoleto, en la práctica sí lo está.

Las List duplican su tamaño, y realizan un rehashing completo de los datos, cuando se llenan al 75% de su capacidad inicial. Por eso, si se conoce de antemano la capacidad inicial que tendrá una List, es útil usar (2*tamaño) en el constructor. De esa manera se evita desde su construcción, tanto la duplicación como el rehashing, que consumen recursos.

febrero 29, 2012 | Registered Commenterchoces

Muchas gracias por la informacion se lo comentare a mi profesora espero que no le siente mal el comentario, gracias por todo.

febrero 29, 2012 | Registered Commenterobs1042