Originariamente inviato da ramy89
Una volta che un oggetto non è più denotabile, il garbage collector segna quella memoria come riutilizzabile.
Può anche non rimuovere gli oggetti dall' heap, ma se ha bisogno di memoria lo fa.
Allora i casi sono due:
1)insieme_nodi cresce man mano che si va avanti nell' iterazione;
2)lista_nodi2 viene salvato da qualche parte o rimane denotabile.
Il codice è questo:
codice:
public void inserisci_archi(){
Set insieme_nodi = g.vertexSet();
ArrayList<Vertex> lista_nodi = new ArrayList<Vertex>(insieme_nodi);
ArrayList<Vertex> lista_nodi2;
ArrayList<Vertex> Nord=new ArrayList<Vertex>();
ArrayList<Vertex> Nord_Est=new ArrayList<Vertex>();
ArrayList<Vertex> Nord_Ovest=new ArrayList<Vertex>();
ArrayList<Vertex> Sud=new ArrayList<Vertex>();
ArrayList<Vertex> Sud_Est=new ArrayList<Vertex>();
ArrayList<Vertex> Sud_Ovest=new ArrayList<Vertex>();
ArrayList<Vertex> Est=new ArrayList<Vertex>();
ArrayList<Vertex> Ovest=new ArrayList<Vertex>();
Iterator<Vertex> it = lista_nodi.iterator();
int h = 0;
while (it.hasNext()) {
Vertex nodo1 = (Vertex) it.next();
lista_nodi2 = new ArrayList<Vertex>(insieme_nodi);
lista_nodi2.remove(h);
h++;
Iterator<Vertex> it2 = lista_nodi2.iterator();
while (it2.hasNext())
{
Vertex nodo2 = (Vertex) it2.next();
double dir=Funzioni_matematiche.azimuth(nodo1.get_centroide(), nodo2.get_centroide());
String direzione=Funzioni_matematiche.stringa_azimuth(dir);
if(direzione.compareTo("Nord")==0){
Nord.add(nodo2);
}
if(direzione.compareTo("Nord-Est")==0){
Nord_Est.add(nodo2);
}
if(direzione.compareTo("Nord-Ovest")==0){
Nord_Ovest.add(nodo2);
}
if(direzione.compareTo("Sud")==0){
Sud.add(nodo2);
}
if(direzione.compareTo("Sud-Est")==0){
Sud_Est.add(nodo2);
}
if(direzione.compareTo("Sud-Ovest")==0){
Sud_Ovest.add(nodo2);
}
if(direzione.compareTo("Est")==0){
Est.add(nodo2);
}
if(direzione.compareTo("Ovest")==0){
Ovest.add(nodo2);
}
}
if(!Nord.isEmpty())
calcola_distanza(nodo1,Nord,"Nord");
if(!Nord_Est.isEmpty())
calcola_distanza(nodo1,Nord_Est,"Nord-Est");
if(!Nord_Ovest.isEmpty())
calcola_distanza(nodo1,Nord_Ovest,"Nord-Ovest");
if(!Sud.isEmpty())
calcola_distanza(nodo1,Sud,"Sud");
if(!Sud_Est.isEmpty())
calcola_distanza(nodo1,Sud_Est,"Sud-Est");
if(!Sud_Ovest.isEmpty())
calcola_distanza(nodo1,Sud_Ovest,"Sud-Ovest");
if(!Est.isEmpty())
calcola_distanza(nodo1,Est,"Est");
if(!Ovest.isEmpty())
calcola_distanza(nodo1,Ovest,"Ovest");
}
}
Poco sotto il primo while vedi che assegna a lista_nodi2 un new ArrayList di vertex.
Pià sotto nel codice vede quali Vertex di quell'arraylist gli interessano e gli aggiunge ad un'altra ArrayList mediante l'add.
Dici che quell'add non fa un clone degli elementi ma non fa altro che referenziare su più liste lo stesso elemento ed è per questo che poi non dealloca la lista? quale sarebbe la soluzione più adatta?