PDA

View Full Version : [Java] Problema con gli iterator e la serializzazione


kekkuz87
17-12-2013, 00:08
Salve a tutti sto studiando java da un po di tempo e per "allenamento/studio" sto scrivendo un piccolo programma che gestisca un archivio personale
il mio problema č che per eliminare un elemento dal archivio ho creato il metodo removeVoceArchvio in questo modo

public class Archivio implements Serializable {

private static final long serialVersionUID= 1L;
protected ArrayList<VoceArchivio> archivio;

public Archivio(){
archivio= new ArrayList<VoceArchivio>();
}

public void addVoceArchivio(VoceArchivio v){
archivio.add(v);
}

public void removeVoceArchivio(VoceArchivio v){
//Iterator<VoceArchivio> it = archivio.iterator();
//while(it.hasNext()){
for(Iterator<VoceArchivio> it = archivio.listIterator();it.hasNext();){
VoceArchivio a = it.next();
if(a.equals(v))
archivio.remove(a);
//it.remove();
}
}

e il metodo funziona se creo ad esempio una classe main dove creo un archivio e applico il metodo removeVoceArchvio
ma la mia idea era ance di salvare in memoria l'archivio per poter accedere successivamente e poter aggiungere o togliere delle voci
quindi ho creato due classi x Serializzare e deserializzare l'archivio
e qui sorge il problema se creo un archivio lo serializzo e successivamente lo deserializzo
e all'archivio applivo il metodo removeVoceArchvio questo non fa nulla

Posto anke le due classi x la serializzazione

package Archivio;
import java.io.*;

public class SerializzaArchivio {
final String nomeFile="archivio.dat";
public SerializzaArchivio(Archivio archivio){

ObjectOutputStream output;
try{
output = new ObjectOutputStream(new FileOutputStream(nomeFile));
output.writeObject(archivio);
output.close();
}
catch (FileNotFoundException e)
{
System.out.println(e);
}

catch (IOException e) {
System.out.println(e);
}
}
}

package Archivio;

import java.io.*;

public class DeserializzaArchivio {
private Archivio archivio;
final String nomeFile="archivio.dat";

public DeserializzaArchivio(){

try{
ObjectInputStream input = new ObjectInputStream(new FileInputStream(nomeFile));
archivio =(Archivio) input.readObject();
input.close();
}
catch (FileNotFoundException e)
{
System.out.println("");
}

catch (IOException e) {
System.out.println(e);
}
catch (ClassNotFoundException e){
System.out.println(e);
}

}
public Archivio getArchivio(){
return archivio;
}
}

Credo che il problema sia un conflitto tra iterator e la serializzazione
Spero di essere stato abbastanza chiaro ma sono un paio di giorni che cerco di risolvere questo problema

mone.java
17-12-2013, 11:04
Ricorda che anche la classe VoceArchivio deve essere serializzabile....

inoltre il tuo metodo per la rimozione


public void removeVoceArchivio(VoceArchivio v){
//Iterator<VoceArchivio> it = archivio.iterator();
//while(it.hasNext()){
for(Iterator<VoceArchivio> it = archivio.listIterator();it.hasNext();){
VoceArchivio a = it.next();
if(a.equals(v))
archivio.remove(a);
//it.remove();
}


si puņ scrivere cosi:


public void removeVoceArchivio(VoceArchivio v){
//fa esattamente la stessa cosa che fai tu sopra (piu o meno)
archivio.remove(v);
}


e ti devi ricordare di implementare il metodo equals all'interno della classe VoceArchivio! altrimenti lui fa il confronto tra indirizzi in memoria! e quindi probabilmente tu stai cercando di rimuovere un oggetto diverso da quello che si trova nell'archivio...

mentre ricorda che per scorrere un archivio (non eliminare elementi perņ):


for (VoceArchivio va : archivio) {
faiQualcosaConVA(va);
}

kekkuz87
17-12-2013, 11:28
ciao grazie per l'aiuto ma per fortuna ho risolto da solo(cosa non fa una notte di sonno:D) dovevo riscrivere esattamente il metodo equals come da te suggerito..comunque mi hai dato la risposta corretta;) ;) ti ringrazio