Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > problema al elminar en arrayList

Hola, tengo un problema al eliminar de un arrayList. Os cuento, para crear un objeto de la clase Profesor accedo a la tabla Profesor para recoger los datos de los profesores y despues hago un inner join entre dos tablas para tener las materias que da cada profesor. Todo esto lo hace bien porque cuando yo imprimo por pantalla la linea que veis muestra los datos perfectamente, el problema es que en otro método en el cual accedo a estos objetos, lo datos(nombre, dni...) lo muestra bien, pero cuando accedo al arraylist del objeto profesor(la lista de materias) me dice que está vacío.
El problema creo que es cuando elimino del arraylist, ya que si quito esa parte lo que hace en esa otra función es mostrarme las materias que dan TODOS los profesores, es decir añade las de un profesor encima de otro(por eso cuando cambia de profesor elimino la lista de materias.

¿Alguien sabe que puede suceder?


/* DECLARACIÓN VARIABLES */
String SQL = null, SQLMat = null;
Statement stmt = null, stmtMat = null;
ResultSet rs = null, rsMat = null;
long id = 0;
ArrayList <Materia> listaMat = new ArrayList <Materia>();

.........


/* RECUPERAMOS LOS DATOS DE PROFESORES*/
SQL = "SELECT * FROM Profesor WHERE obsoleto_prof=false";
stmt = conex.createStatement();
rs = stmt.executeQuery(SQL);
/* AÑADIR CURSOS A LISTA PROFESORES */
while (rs.next()) {

id = rs.getLong("id_prof");

/* RECUPERAMOS LOS DATOS DE LAS MATERIAS */
modListaMat.removeAllElements();
SQLMat = "SELECT * FROM ensenha INNER JOIN Materia ON ensenha.id_mat=Materia.id_mat WHERE ensenha.id_prof="+id+""; // Recuperamos las materias asociadas al Profesor
stmtMat = conex.createStatement();
rsMat = stmtMat.executeQuery(SQLMat);

while (rsMat.next()) {
Materia mat = new Materia(rsMat.getLong("id_mat"), rsMat.getString("nombre_mat"), rsMat.getBoolean("obsoleto_mat"));
listaMat.add(mat);
}

Profesor prof = new Profesor(id, rs.getString("nombre_prof"), rs.getString("apellido_prof"), rs.getString("dni_prof"), rs.getInt("horas_prof"), rs.getString("fechaContr_prof"), rs.getBoolean("obsoleto_prof"), listaMat);
modLista.addElement(prof);

for ( int i=0 ; i<prof.getListaMaterias().size() ; i++)
System.out.println(id+"-"+prof.getListaMaterias().get(i).getNombre());

Iterator i = listaMat.iterator();
while (i.hasNext()) {
i.next();
i.remove();
}

}

........

diciembre 12, 2011 | Unregistered Commenteresebayolo

Pero segun lei, tu ya sabes que es lo que esta pasando

diciembre 12, 2011 | Unregistered CommenterResalpa84

El problema se encuentra en que al constructor de Profesor le pasas la referencia a listaMat. Si la instancia de Profesor se guarda esta referencia en lugar de hacer una copia cualquier operación que se haga se propaga a la lista guardada en el objeto de tipo Profesor. En lugar de borrar listaMat como lo haces, crea una instancia nueva en cada iteración del bucle.

diciembre 12, 2011 | Unregistered CommenterGarca

Gracias a los dos, lo he solucionado cambiando la declaración del arraylist a dentro del bucle while.

Saludos.

diciembre 13, 2011 | Unregistered Commenteresebayolo