Array bidimensionale. Sovrascrittura dati.

di il
4 risposte

Array bidimensionale. Sovrascrittura dati.

Buongiorno, come capirete sono alla prime armi con questo linguaggio...ma non con la programmazione. Non riesco ad impostare un valore statico di un array di un array.

Mi spiego meglio: per iniziare carico un elemento di un ArrayList[0] con un altro Array che ha 2 valori. Il problema è che cambiando i valori del secondo Array ed aggiungendoli ad ArrayList[1] mi sovrascrive anche i valori dell'ArrayList[0]. Ho capito che si comporta così perchè perchè più che un valore nel primo array carica il collegamento "dinamico" al secondo array ma non capisco come impostare un valore nel primo array e "fissarlo" svincolandolo dal secondo Array. Mi scuso se non mi sono spiegato ma l'esempio è più esplicativo. Grazie in anticipo.

import java.util.ArrayList;
public class HelloWorld{

public static void main(String []args){
ArrayList<String> elem1 = new ArrayList<String> ();
elem1.add ("Hello1");
elem1.add ("Hello2");

ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>> ();
arr.add (elem1);

System.out.println("elem1=" + elem1);
System.out.println("arr=" + arr);
System.out.println("------------------------------------------------");

elem1.clear();
System.out.println("elem1=" + elem1);
System.out.println("arr=" + arr);
elem1.add ("Ciao1");
elem1.add ("Ciao2");
arr.add (elem1);

System.out.println("elem1=" + elem1);
System.out.println("arr=" + arr);
}
}

OUTPUT
elem1=[Hello1, Hello2]
arr=[[Hello1, Hello2]]
------------------------------------------------
elem1=[]
arr=[[]]
elem1=[Ciao1, Ciao2]
arr=[[Ciao1, Ciao2], [Ciao1, Ciao2]]

.....il risultato che vorrei ottenere sarebbe:

arr=[[Hello1, Hello2], [Ciao1, Ciao2]]

4 Risposte

  • Re: Array bidimensionale. Sovrascrittura dati.

    Javabeg ha scritto:


    elem1=[Ciao1, Ciao2]
    arr=[[Ciao1, Ciao2], [Ciao1, Ciao2]]
    Hai aggiunto in arr 2 volte il riferimento a elem1 quindi "vedi" due volte il contenuto di elem1.

    Javabeg ha scritto:


    .....il risultato che vorrei ottenere sarebbe:

    arr=[[Hello1, Hello2], [Ciao1, Ciao2]]
    Devi creare un nuovo ArrayList<String> e inserirlo in arr. Puoi ri-usare la variabile elem1 (assegnandoci il nuovo ArrayList<String>) se non ti serve per altro. Ma non puoi ri-usare quell'oggetto ArrayList<String> iniziale.
  • Re: Array bidimensionale. Sovrascrittura dati.

    OK grazie ora funziona!! Ho inserito l'istruzione ==> elem1 = new ArrayList<String> (); ed è tutto Ok. Praticamente devo ricreare un nuovo Array ogni volta anche se è già allocato in memoria...credevo che riallocare lo spazio ogni volta fosse uno spreco di risorse oltre che creare un rallentamento del sistema. Non capisco perchè in JAVA non posso riutilizzare delle variabili già allocate in memoria. Scusami ma vengo dal vecchio linguaggio COBOL ed ho delle difficoltà a capire alcune logiche
  • Re: Array bidimensionale. Sovrascrittura dati.

    Javabeg ha scritto:


    Praticamente devo ricreare un nuovo Array ogni volta anche se è già allocato in memoria...
    Certo, ma lo hai precisato tu espressamente: vuoi avere dati differenti tra i due ArrayList!

    [[Hello1, Hello2], [Ciao1, Ciao2]]

    Quindi per forza devi avere 2 ArrayList<String> distinti referenziati dal ArrayList<ArrayList<String>> principale.

    Javabeg ha scritto:


    credevo che riallocare lo spazio ogni volta fosse uno spreco di risorse oltre che creare un rallentamento del sistema.
    Stiamo parlando di 2 oggetti ArrayList ..... non del software della NASA ....
    Scherzi a parte, certamente avere un numero enorme di oggetti potrebbe essere un problema ma bisogna sempre vedere cosa si deve fare, come lo si fa, con quali logiche/algoritmi, ecc...
    Nel tuo caso non c'è bisogno di porsi queste questioni.

    Javabeg ha scritto:


    Non capisco perchè in JAVA non posso riutilizzare delle variabili già allocate in memoria.
    Chiariamo: un conto sono le variabili, un altro gli oggetti. Le variabili contengono solo un valore. Nel caso dei tipi primitivi, la variabile contiene un valore numerico usando un numero ben precisato di bit (o un true/false se boolean). Un valore che è ben determinabile, stampabile e manipolabile.
    Nel caso dei tipi reference la variabile contiene un "riferimento" (una sorta di indirizzo) che però è molto "opaco", cioè di cui non sai nulla e che non si può manipolare in altri modi (differentemente dal C/C++). L'unica cosa che si sa è che può essere null (=nessun oggetto) oppure può contenere un riferimento ad un oggetto.

    Due variabili diverse possono fare riferimento allo stesso oggetto:

    ArrayList<String> arr1 = new ArrayList<String>();
    ArrayList<String> arr2 = arr1;

    Qui hai 2 variabili distinte ma che referenziano lo STESSO oggetto. Questo oggetto lo puoi modificare usando entrambe le variabili.

    arr1.add("bla");
    oppure
    arr2.add("bla");

    sarebbe la stessa cosa.

    Ma le variabili le puoi anche riusare, avendo ben chiaro come gestire gli oggetti.
    ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
    
    ArrayList<String> subarr = new ArrayList<String>();
    subarr.add("Hello");
    arr.add(subarr);
    
    subarr = new ArrayList<String>();   // riusi la stessa variabile
    subarr.add("Ciao");
    arr.add(subarr);
    Nella riga indicata "riusi la stessa variabile" assegni un nuovo oggetto ArrayList alla variabile subarr. L'oggetto che era referenziato in precedenza in realtà non lo "perdi" perché lo hai inserito in arr.
  • Re: Array bidimensionale. Sovrascrittura dati.

    Scusami andbin ma leggo solo ora il tuo messaggio. Grazie sei stato chiarissimo, ora ho capito bene come funziona il "giro"!!!
Devi accedere o registrarti per scrivere nel forum
4 risposte