arraylistS в arraylist of arraylistS ведут себя как один и тот же экземпляр, несмотря на «новый Arraylist <MyObj>()» - PullRequest
0 голосов
/ 06 июня 2011

мои arraylistS в покрывающем arraylist ведут себя как один и тот же экземпляр.

я манипулирую одним из них с помощью

i=0; manupulate((ArrayList)theCoveringRootArrayList.get(i));

, и все субрарайлисты подвергаются манипуляции.

я сделал свою домашнюю работу, я немного погуглил, но в гугле было сказано: "создать новый экземпляр с помощью myvar = new myobject ()"

я уже сделал это.

вот код:

    ArrayList denemeKombinasyonuCumleKelimesiListesiListesi=new ArrayList();

    int i=0,j=0;
    ArrayList<CumleKelimesi> geciciListe=new ArrayList<CumleKelimesi>();
    while(matris[0][j]!=-1){
        geciciListe=new ArrayList<CumleKelimesi>();
        i=0;
        while(i<cumle.cumleKelimeleri.size()){
            if(!cumle.cumleKelimeleri.get(i).noktalamaMi){
            geciciListe.add(cumle.cumleKelimeleri.get(i).olasilikliKelimeler.get(matris[i][j]));
            }else{
            geciciListe.add(cumle.cumleKelimeleri.get(i));
            }
            i++;
        }
        denemeKombinasyonuCumleKelimesiListesiListesi.add(geciciListe);
        j++;

    }
    i=0;
    int enAzAyristirilamayan=9999;
    int enAzAyristirilamayanliListeninYeri=0;
    while(i<denemeKombinasyonuCumleKelimesiListesiListesi.size()){
        ArrayList<CumleKelimesi> cka=new ArrayList<CumleKelimesi>();
        cka.addAll((ArrayList)denemeKombinasyonuCumleKelimesiListesiListesi.get(i));
        int ayristirilamayanSayisi=Ayristirici.ayristirmaAlgoritmasi(cka);
            if(ayristirilamayanSayisi<enAzAyristirilamayan){
                enAzAyristirilamayan=ayristirilamayanSayisi;
                enAzAyristirilamayanliListeninYeri=i;
            }
         denemeKombinasyonuCumleKelimesiListesiListesi.set(i, cka);
        i++;
    }
    geciciListe=(ArrayList)denemeKombinasyonuCumleKelimesiListesiListesi.get(enAzAyristirilamayanliListeninYeri);

    return geciciListe;

как вы можете видеть, я делаю все, чтобы почувствовать их как разные экземпляры, но на каждый из них воздействует метод манипуляции.мои переменные называются по-турецки, но я думаю, что вы видите, что к чему

, например

geciciliste = временный список

denemeKombinasyonuCumleKelimesiListesiListesi = инкапсулирующий список как массив массивов, чтоможет быть проблема спасибо заранее


---------------- редактировать --------------------------------------------------------------------

вот мои попытки выполнить задачу глубокого копирования:

    ArrayList<ArrayList<CumleKelimesi>> denemeKombinasyonuCumleKelimesiListesiListesi=new       ArrayList<ArrayList<CumleKelimesi>>();

    int i=0,j=0;
    ArrayList<CumleKelimesi> geciciListe=new ArrayList<CumleKelimesi>();
    while(matris[0][j]!=-1){
        geciciListe=new ArrayList<CumleKelimesi>();
        i=0;
        while(i<cumle.cumleKelimeleri.size()){
            if(!cumle.cumleKelimeleri.get(i).noktalamaMi){
            geciciListe.add(cumle.cumleKelimeleri.get(i).olasilikliKelimeler.get(matris[i][j]));
            }else{
            geciciListe.add(cumle.cumleKelimeleri.get(i));
            }
            i++;
        }
        denemeKombinasyonuCumleKelimesiListesiListesi.add(geciciListe);
        j++;

    }
    i=0;
    int enAzAyristirilamayan=9999;
    int enAzAyristirilamayanliListeninYeri=0;
    while(i<denemeKombinasyonuCumleKelimesiListesiListesi.size()){
        ArrayList<CumleKelimesi> cka=new ArrayList<CumleKelimesi>();
        MetindenGrafOlusturma.copy(denemeKombinasyonuCumleKelimesiListesiListesi.get(i),cka);
        int ayristirilamayanSayisi=Ayristirici.ayristirmaAlgoritmasi(cka);
            if(ayristirilamayanSayisi<enAzAyristirilamayan){
                enAzAyristirilamayan=ayristirilamayanSayisi;
                enAzAyristirilamayanliListeninYeri=i;
            }
         denemeKombinasyonuCumleKelimesiListesiListesi.set(i, cka);
        i++;
    }
    geciciListe=(ArrayList)denemeKombinasyonuCumleKelimesiListesiListesi.get(enAzAyristirilamayanliListeninYeri);

    return geciciListe;

}

публичная статическая пустая копия (ArrayList theList, ArrayList deepCopy) {// deepCopy = new ArrayList (); // ifя не комментирую deepcopy будет пустым для (CumleKelimesi ck: theList) deepCopy.add (ck.clone ());}

вот метод клонирования объекта CumleKelimesi

     public CumleKelimesi clone()
      {
          try
      {
              return (CumleKelimesi)super.clone();
          }
      catch( CloneNotSupportedException e )
      {
              return null;
          }
      }

, если все они неверны, пожалуйста, посоветуйте другой метод глубокого копирования, и я очень запутался

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

Вы делаете мелкую копию списка, когда говорите: а = (ArrayList) theCoveringRootArraylist.get (я); * +1001 *

i-й индекс вCoveringRootArraylist и переменная списка 'a' указывают на один и тот же список, и, следовательно, оба они изменяются при "manupulate (a)".

Попробуйте сделать глубокую копию, а затем измените.

0 голосов
/ 09 июня 2011

При определении нового объекта с помощью

new MyObj(myObj);

я использовал конструктор

public MyObj(MyObj myObj){
this.memberlist=myObj.memberlist;
//the mistake was here 
//memberlist is another arraylist
//must deep copy this too
...

}

Я изменил код с помощью

public MyObj(MyObj myObj){
this.memberlist=new ArrayList<AnotherObject>();
this.memberlist.addAll(myObj.memberlist);
...

}

Здесь он сказалдля меня "глубокая копия" моих arraylists.Теперь я вижу, что я тоже должен "глубоко скопировать" "списки участников".

0 голосов
/ 07 июня 2011

Вот как я пытался глубоко скопировать задачу:

    ArrayList<ArrayList<CumleKelimesi>> denemeKombinasyonuCumleKelimesiListesiListesi=new       ArrayList<ArrayList<CumleKelimesi>>();

    int i=0,j=0;
    ArrayList<CumleKelimesi> geciciListe=new ArrayList<CumleKelimesi>();
    while(matris[0][j]!=-1){
        geciciListe=new ArrayList<CumleKelimesi>();
        i=0;
        while(i<cumle.cumleKelimeleri.size()){
            if(!cumle.cumleKelimeleri.get(i).noktalamaMi){
            geciciListe.add(cumle.cumleKelimeleri.get(i).olasilikliKelimeler.get(matris[i][j]));
            }else{
            geciciListe.add(cumle.cumleKelimeleri.get(i));
            }
            i++;
        }
        denemeKombinasyonuCumleKelimesiListesiListesi.add(geciciListe);
        j++;

    }
    i=0;
    int enAzAyristirilamayan=9999;
    int enAzAyristirilamayanliListeninYeri=0;
    while(i<denemeKombinasyonuCumleKelimesiListesiListesi.size()){
        ArrayList<CumleKelimesi> cka=new ArrayList<CumleKelimesi>();
        MetindenGrafOlusturma.copy(denemeKombinasyonuCumleKelimesiListesiListesi.get(i),cka);
        int ayristirilamayanSayisi=Ayristirici.ayristirmaAlgoritmasi(cka);
            if(ayristirilamayanSayisi<enAzAyristirilamayan){
                enAzAyristirilamayan=ayristirilamayanSayisi;
                enAzAyristirilamayanliListeninYeri=i;
            }
         denemeKombinasyonuCumleKelimesiListesiListesi.set(i, cka);
        i++;
    }
    geciciListe=(ArrayList)denemeKombinasyonuCumleKelimesiListesiListesi.get(enAzAyristirilamayanliListeninYeri);

    return geciciListe;

}

public static void copy(ArrayList<CumleKelimesi> theList,ArrayList<CumleKelimesi> deepCopy) {
    //deepCopy = new ArrayList<CumleKelimesi>();//if i un comment deepcopy would be empty
    for (CumleKelimesi ck : theList)
        deepCopy.add(ck.clone());
}

Вот метод клонирования объекта CumleKelimesi:

     public CumleKelimesi clone()
      {
          try
      {
              return (CumleKelimesi)super.clone();
          }
      catch( CloneNotSupportedException e )
      {
              return null;
          }
      }

Если все это не так, пожалуйста, посоветуйте другой метод глубокого копирования, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...