Úplná kópia ArrayListu

Programovacie jazyky, rady, poradňa...
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Úplná kópia ArrayListu

Príspevok od používateľa pitbullko »

Ahojte,
potreboval by som spraviť zálohu ArrayListu, teda získať dva nezávislé ArrayListy, nie dve referencie na jeden ArrayList.
Viem, že niečo podobné sa riešilo v tejto téme http://www.hojko.com/java-problem-s-pre ... ilit=clone
Podľa googlu by to malo asi takto nejako fungovať, avšak pri kompilácií mám problém s metódou clone() ktorá je protected.

Trieda Osoba:

Kód: Vybrať všetko

public class Osoba implements Cloneable {
    private String meno;
    private String priezv;

    public Osoba(String meno, String priezv){
        this.meno = meno;
        this.priezv = priezv;
    }
}
main:

Kód: Vybrať všetko

public class CopyArrayList{

    public static void main(String[] args) throws CloneNotSupportedException{

        ArrayList<Osoba> al1 = new ArrayList<Osoba>();
        al1.add(new Osoba("Janko", "Hrasko"));
        al1.add(new Osoba("Ferko", "Mrkvicka"));

        ArrayList backup = new ArrayList();
        for (Object obj : al1)
           backup.add(obj.clone);
    }
}
Vedel by niekto ako na to?.
Dík
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Úplná kópia ArrayListu

Príspevok od používateľa harrison314 »

Tie objekty musia implementovat rozhranie Clonable,
a mas tam chybu, za clone nie su zatvorky.
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Úplná kópia ArrayListu

Príspevok od používateľa javatar »

clone ti urobi len plytku kopiu - t.j. vsetky objekty vo vnutri arraylistu ti podaju len dalsiu referenciu na seba, nie kopiu objektu
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Re: Úplná kópia ArrayListu

Príspevok od používateľa pitbullko »

Stále to nechce skompilovať ani s tými zátvorkami. V API je písané, že clone() vytvorí a vráti kópiu objektu tak by to malo objekt aj skopírovať nie?
paralen
Light Star
Light Star
Príspevky: 267
Registrovaný: 02 máj 2006, 15:15

Re: Úplná kópia ArrayListu

Príspevok od používateľa paralen »

Chybu to pise preto lebo v triede, ktora implementuje rozhranie Cloneable (Osoba) musis prekryt (Override) metodu clone() napr. takto:

Kód: Vybrať všetko

@Override
public Object clone() {
    Object o = null;
    try {
        o = super.clone();
    }
    catch (CloneNotSupportedException e) {
        System.err.println(e.getMessage());
    }
    return o;
}
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Re: Úplná kópia ArrayListu

Príspevok od používateľa pitbullko »

javatar mal si pravdu, clone() robí iba shallow (plytkú) kópiu.
Nakoniec som to spravil betónovým riešením.

Kód: Vybrať všetko

public class Osoba{
    private String meno;
    private String priezv;

    public Osoba(String meno, String priezv){}

    public Osoba(String meno, String priezv){
        this.meno = meno;
        this.priezv = priezv;
    }

    public String getMeno(){
        return this.meno;
    }

    public String getPriezv(){
        return this.priezv;
    }

}

Kód: Vybrať všetko

public class CopyArrayList{

    public static void main(String[] args){

        ArrayList<Osoba> al1 = new ArrayList<Osoba>();
        al1.add(new Osoba("Janko", "Hrasko"));
        al1.add(new Osoba("Ferko", "Mrkvicka"));

        ArrayList<Osoba> backup = new ArrayList<Osoba>();
        for (Osoba osoba : al1)
           backup.add(new Osoba(al1.getMeno, al1.getPriezv));
    }
}
Díky všetkým za pomoc!
Napísať odpoveď