Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование ArrayList 
V
    Опции темы
LSD
Дата 2.7.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Нет ни одного готового класса который мог бы осуществлять глубокое клонирование, потому что у Object метод clone() не public.

Так что или писать такое дело самому (с учетом того, что храниться в List) или сделать клонирование через сериализацию (объекты естественно должны быть сериализуемы).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Reptor
Дата 2.7.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



ехххх, да незадачка. 


мне удивительно почему не помагает   

Код

class X{
.....
}

class X2{

   private ArrayList<X> list   = new ArrayList<X>();
   
   public X2(ArrayList<X> list){
               this.list =  new ArrayList<X>(list)
   }
}



вроде ж как через new..


PM MAIL ICQ   Вверх
LSD
Дата 2.7.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



new создает новый ArrayList и копирует туда ссылки на объекты из исходной коллекции.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Reptor
Дата 2.7.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



попробую конечно через итераторы но думаю что ничего хорошего из этого не выйдет. 


LSD,  а как это через сериализацию?

Добавлено @ 11:55
ого так это ж ещё надо будет создавать каждый объект что в листе заново.... ведь если их просто переписать всеровно ссылки та останутся на старые...

не это не реально, это все переменные объекта надо будет достать и заново записать в новый объект, мало того что объектов не мало в листе так ещё и у объекта много всего...

Это сообщение отредактировал(а) Reptor - 2.7.2008, 11:56
PM MAIL ICQ   Вверх
Platon
Дата 2.7.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Reptor, ну, а что сделать? Ты такие условия ставишь. Или смирись, или ищи как обойтись только ссылками на объекты.
PM MAIL ICQ   Вверх
Reptor
Дата 2.7.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Platon,  ну а как обойтись ссылками... не как не выйдет так как они то должны быть независимы а так меняеш один меняется 2-ой...   smile 
PM MAIL ICQ   Вверх
LSD
Дата 2.7.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Reptor @  2.7.2008,  12:48 Найти цитируемый пост)
LSD,  а как это через сериализацию?

Да практически как гланды удалять через ж smile 
Код

  public static Object serialClone(Serializable s)
  {
    try
    {
      ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
      ObjectOutputStream objectOut = new ObjectOutputStream(byteOut);
      objectOut.writeObject(s);
      objectOut.close();

      ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
      ObjectInputStream objectIn = new ObjectInputStream(byteIn);
      Object copy = objectIn.readObject();
      objectIn.close();
      return copy;
    }
    catch(IOException e)
    {
      return null;// mustn't happend
    }
    catch(ClassNotFoundException e)
    {
      return null;// mustn't happend
    }
  }

  public static void main(String[] args) throws Exception
  {
    StringBuilder buffer = new StringBuilder("aaa");
    ArrayList<StringBuilder> list  = new ArrayList<StringBuilder>();
    list.add(buffer);

    ArrayList<StringBuilder> copy1  = (ArrayList<StringBuilder>) list.clone();
    ArrayList<StringBuilder> copy2  = (ArrayList<StringBuilder>) serialClone(list);

    System.out.println("list  = " + list);
    System.out.println("copy1 = " + copy1);
    System.out.println("copy2 = " + copy2);

    System.out.println("Changing...");
    buffer.append("bbbb");
    list.add(new StringBuilder("zzz"));

    System.out.println("list  = " + list);
    System.out.println("copy1 = " + copy1);
    System.out.println("copy2 = " + copy2);
  }

только учти, что это штука не быстрая и глубокое клонирование будет работать быстрее.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Reptor
Дата 2.7.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Цитата

что это штука не быстрая и глубокое клонирование будет работать быстрее


я не совсем понимаю что имеется в виду под глубоким копированием? почему глубоким?
PM MAIL ICQ   Вверх
dorogoyIV
Дата 2.7.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(Reptor @  2.7.2008,  14:05 Найти цитируемый пост)
я не совсем понимаю что имеется в виду под глубоким копированием? почему глубоким?

имеется ввиду:
глубокое клонирование - копирование всего массива с такими же объектами, только новыми
поверхностное клонирование - копирование всего массива с теми же ссылками (сам массив новый)

 smile  тоже наверное не очень понятно пояснил  smile 

Это сообщение отредактировал(а) dorogoyIV - 2.7.2008, 14:44
PM MAIL   Вверх
Reptor
Дата 2.7.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



dorogoyIV,  всё я понял..  smile  

всем огромное спасибо... 

надо будет попробовать сделать 2 варианта.
PM MAIL ICQ   Вверх
Reptor
Дата 3.7.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



LSD,  смотри я немножко поменял то что ты прислал и у меня что то не вышло 

Код


import java.util.*;
import java.io.*;

public class zz {
    
     public static Object serialClone(Serializable s)    
      {    
        try    
        {    
          ByteArrayOutputStream byteOut = new ByteArrayOutputStream();    
          ObjectOutputStream objectOut = new ObjectOutputStream(byteOut);    
          objectOut.writeObject(s);    
          objectOut.close();    
          ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());    
          ObjectInputStream objectIn = new ObjectInputStream(byteIn);    
          Object copy = objectIn.readObject();    
          objectIn.close();    
          return copy;    
        }    
        catch(IOException e)
        {    
            return null;// mustn't happend    
          }    
          catch(ClassNotFoundException e)    
          {    
            return null;// mustn't happend    
          }    
        }
     
     public static void main(String[] args) throws Exception    
      {    
        StringBuilder buffer = new StringBuilder("aaa");    
        ArrayList<StringBuilder> list  = new ArrayList<StringBuilder>();    
        list.add(buffer);    
        ArrayList<StringBuilder> copy1  = (ArrayList<StringBuilder>) list.clone();    
        ArrayList<StringBuilder> copy2  = (ArrayList<StringBuilder>) zz.serialClone(list);    
        System.out.println("list  = " + list);    
        System.out.println("copy1 = " + copy1);    
        System.out.println("copy2 = " + copy2);    
        System.out.println("Changing...");    
        buffer.append("bbbb");    
        list.add(new StringBuilder("zzz"));
       
        copy1.get(0).append("ddd");
        copy2.get(0).append("hello");
        
        System.out.println("list  = " + list);    
        System.out.println("copy1 = " + copy1);    
        System.out.println("copy2 = " + copy2);    
        
        
        ArrayList<dd> listDD  = new ArrayList<dd>();    
        listDD.add(new dd(1));
        listDD.add(new dd(2));
        listDD.add(new dd(3));
        listDD.add(new dd(4));
        listDD.add(new dd(5));
        
        ArrayList<dd> copy1_2  = (ArrayList<dd>) listDD.clone();    
        ArrayList<dd> copy2_2  = (ArrayList<dd>) zz.serialClone(listDD);    
        
        
        System.out.println("list  = " + listDD);    
        System.out.println("copy1 = " + copy1_2);    
        System.out.println("copy2 = " + copy2_2);    
        
      }
}


и вот класс экземпляры которого в листе 

Код

public class dd{
    private int a =0;
    
    public dd(int a){
        this.a = a;            
    }
    
    public int  getA(){
        return a;
    }
    
    public void setA(int a){
        this.a = a;
    }
}



и вот вывод 

list  = [aaa]
copy1 = [aaa]
copy2 = [aaa]

Changing...
list  = [aaabbbbddd, zzz]
copy1 = [aaabbbbddd]
copy2 = [aaahello]


list  = [dd@1632c2d, dd@d70d7a, dd@b5f53a, dd@1f6f0bf, dd@137c60d]
copy1 = [dd@1632c2d, dd@d70d7a, dd@b5f53a, dd@1f6f0bf, dd@137c60d]
copy2 = null

почему то на  ArrayList<dd> copy2_2  = (ArrayList<dd>) zz.serialClone(listDD);     не сработало  copy2 = null ?

Может что то с классом не так?

а так всё хорошо работает а с собственным классом не хочет.

Добавлено @ 11:08 

о понял надо ж
Код

 implements Serializable


Это сообщение отредактировал(а) Reptor - 3.7.2008, 11:09
PM MAIL ICQ   Вверх
Reptor
Дата 15.7.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



у меня ещё такой вопрос по поводу сеарилизацыи

если у меня в классе есть внутрений класс то что б он тоже сеарилизовался надо у него тоже указывать implements Serializable. Или у его родителя достаточно??

Просто в зависимости от того указываю я или нет то приложение как то по разному себя ведёт.
PM MAIL ICQ   Вверх
Platon
Дата 16.7.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Все классы должны быть сериализуемыми. 
PM MAIL ICQ   Вверх
Reptor
Дата 16.7.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Platon,  да я смотрю что если во внутренем классе не ставить  implements Serializable то основной совсем не клонируется
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0931 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.