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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование обьекта 
:(
    Опции темы
ElectricalStorm
Дата 3.8.2004, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



есть обьект класса LinkedHashMap - hash нужно создать его копию ... таким образом что бы при изменении
самого объекта копия не исменялась ?


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 3.8.2004, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



clone().

Это сообщение отредактировал(а) Domestic Cat - 3.8.2004, 15:41


--------------------

PM   Вверх
ElectricalStorm
Дата 3.8.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



непомог мне clone sad.gif
Добавлено @ 15:46
кажется до меня дошло ....
мне нужно глубокое клонирование ...


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 3.8.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



smile.gif Нужно написать сабкласс и сделать свой clone()


--------------------

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


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



это сложно ....я слышал что есть более простой способ с помощью копи конструктора

?






--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 3.8.2004, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Нужно тогда все равно делать сабкласс с конструктором:
Код

A (A other)
{
   field1 = other.getField1();
   field2 = other.getField2();
  ...
}

Вот что по этому поводу пишет Эккель:
Цитата

Why does it work in C++ and not Java?

The copy constructor is a fundamental part of C++, since it automatically makes a local copy of an object. Yet the example above proves that it does not work for Java. Why? In Java everything that we manipulate is a handle, while in C++ you can have handle-like entities and you can also pass around the objects directly. That’s what the C++ copy constructor is for: when you want to take an object and pass it in by value, thus duplicating the object. So it works fine in C++, but you should keep in mind that this scheme fails in Java, so don’t use it


В принципе того же эффекта можно добиться если
написать метод типа :
Код

A makeCopy(A a)
{
   ....
}


Все равно нужно помнить о том, что копия должна быть глубокой. Cамый естественный метод - \
clone()


--------------------

PM   Вверх
ElectricalStorm
Дата 3.8.2004, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



Спасибо !

ушел думать smile.gif

Это сообщение отредактировал(а) ElectricalStorm - 3.8.2004, 17:29


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
ElectricalStorm
Дата 3.8.2004, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



вот написал код для LinkedHashMap двойной вложености а как сделать для неопределенной ...
я понимаю что нужно реализовать рекурсивный метод copy но чего-то никак не получается ... sad.gif


Код


import java.util.Iterator;
import java.util.LinkedHashMap;

public class Collections {

   public Collections() {
   }

   public static void main(String args[]) {
       Collections collections = new Collections();

       LinkedHashMap linkedhashmap = new LinkedHashMap();
       LinkedHashMap linkedhashmap1 = new LinkedHashMap();

       linkedhashmap1.put("1", "a");
       linkedhashmap1.put("2", "b");
       linkedhashmap1.put("3", "c");
       linkedhashmap1.put("4", "d");

       linkedhashmap.put("a", linkedhashmap1);
       linkedhashmap.put("b", linkedhashmap1);
       linkedhashmap.put("c", linkedhashmap1);
       linkedhashmap.put("d", linkedhashmap1);

       LinkedHashMap linkedhashmap2 = collections.copy(linkedhashmap);
       linkedhashmap.clear();

       java.util.Map.Entry entry;
       for (Iterator iterator = linkedhashmap2.entrySet().iterator(); iterator.hasNext();
            System.out.println(entry.getKey() + " , " + entry.getValue()))
           entry = (java.util.Map.Entry) iterator.next();

   }

   public LinkedHashMap copy(LinkedHashMap linkedhashmap) {
       LinkedHashMap linkedhashmap1 = new LinkedHashMap();
       java.util.Map.Entry entry;
       for (Iterator iterator = linkedhashmap.entrySet().iterator(); iterator.hasNext();
            linkedhashmap1.put(entry.getKey(), ((LinkedHashMap) entry.getValue()).clone()))
           entry = (java.util.Map.Entry) iterator.next();

       return linkedhashmap1;
   }

}




--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 3.8.2004, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Код

public MyLinkedHashMap copy(MyLinkedHashMap linkedhashmap) {
       MyLinkedHashMap linkedhashmap1 = new MyLinkedHashMap();
       java.util.Map.Entry entry;
       for (Iterator iterator = linkedhashmap.entrySet().iterator(); iterator.hasNext();
            linkedhashmap1.put(entry.getKey(),
          ((MyLinkedHashMap) entry.getValue()).copy()))     // <----------
          entry = (java.util.Map.Entry) iterator.next();

       return linkedhashmap1;
   }


Но сработает только если MyLinkedHashMap - сабкласс LinkedHashMap, и содержит этот самый метод copy. Тогда назови метод не copy а clone ... biggrin.gif

Это сообщение отредактировал(а) Domestic Cat - 3.8.2004, 18:02


--------------------

PM   Вверх
ElectricalStorm
Дата 3.8.2004, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



аааааа.... кажися дашло smile.gif Спасибо !


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
ElectricalStorm
Дата 3.8.2004, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



чесно говоря не совсем понял почему но это работает smile.gif

Код


import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

public class Collections extends LinkedHashMap {
   public static void main(String[] args) {

       MyLinkedMap hash = new MyLinkedMap();
       LinkedHashMap inner = new LinkedHashMap();
       LinkedHashMap iInner = new LinkedHashMap();

       iInner.put("1", "a");
       iInner.put("2", "b");
       iInner.put("3", "c");
       iInner.put("4", "d");

       inner.put("1", iInner);
       inner.put("2", iInner);
       inner.put("3", iInner);
       inner.put("4", iInner);

       hash.put("a", inner);
       hash.put("b", inner);
       hash.put("c", inner);
       hash.put("d", inner);

       MyLinkedMap h = (MyLinkedMap) hash.clone();

       hash.clear();

       for (Iterator i = h.entrySet().iterator(); i.hasNext();) {
           Map.Entry e = (Map.Entry) i.next();
           System.out.println(e.getKey() + " , " + e.getValue());
       }
   }


   public static class MyLinkedMap extends LinkedHashMap {
       public MyLinkedMap() {
           super();
       }

       public MyLinkedMap clone(MyLinkedMap lm) {
           for (Iterator i = this.entrySet().iterator(); i.hasNext();) {
               Map.Entry entry = (java.util.Map.Entry) i.next();
               lm.put(entry.getKey(), ((MyLinkedMap) entry.getValue()).clone());
           }

           return lm;
       }
   }
}






--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
ElectricalStorm
Дата 3.8.2004, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



нет сорри не работает sad.gif


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 3.8.2004, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Т
Код

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

public class Test {

public static void main(String[] args)
{

MyLinkedMap hash = new MyLinkedMap();
LinkedHashMap inn = new LinkedHashMap();
LinkedHashMap iInner = new LinkedHashMap();

iInner.put("1", "a");
iInner.put("2", "b");
iInner.put("3", "c");
iInner.put("4", "d");
inn.put("1", iInner);
inn.put("2", iInner);
inn.put("3", iInner);
inn.put("4", iInner);
hash.put("a", inn);
hash.put("b", inn);
hash.put("c", inn);
hash.put("d", inn);

MyLinkedMap h = (MyLinkedMap) hash.clone();
hash.clear();
for (Iterator i = h.entrySet().iterator(); i.hasNext();) {
Map.Entry e = (Map.Entry) i.next();
System.out.println(e.getKey() + " , " + e.getValue());
}
}
}

class MyLinkedMap extends LinkedHashMap {

public MyLinkedMap() {
super();
}

public Object clone() {
MyLinkedMap copy = new MyLinkedMap();
for (Iterator i = entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (java.util.Map.Entry) i.next();
if (entry instanceof MyLinkedMap)
{
   copy.put(entry.getKey(), ((MyLinkedMap) entry.getValue()).clone());
}
else
{
   copy.put(entry.getKey(), entry.getValue());
}
}
return (Object) copy;
}
}


Это сообщение отредактировал(а) Domestic Cat - 3.8.2004, 19:10


--------------------

PM   Вверх
ElectricalStorm
Дата 3.8.2004, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



Спасибо большое в этом примере всё прекрасно но при переносе в программу не работает sad.gif


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 3.8.2004, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Странно, может тогда код приведешь?


--------------------

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

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

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


 




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


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

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