JavaRush/Java блог/Архив info.javarush/Функции метода Object.clone()
pro100boy
41 уровень

Функции метода Object.clone()

Статья из группы Архив info.javarush
участников
Всем привет. Хочу спросить совета или подсказку. Несколько дней не могу решить простую на первый взгляд задачу на рекурсивное клонирование. Тут в разделе "Функции метода Object.clone()" есть пример Snake. И вопрос: как сделать глубокое клонирование Snake?
Комментарии (2)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
pro100boy
Уровень 41
27 августа 2015, 09:26
Решил таки… Через костыль tmp, но… Может кто предложит вариант лаконичнее.

public class Snake implements Cloneable {
    private Snake next, tmp;
    private char c;

    // Значение i == количеству сегментов
    Snake(int i, char x) {
        c = x;
        if(--i > 0)
            next = new Snake(i, (char) (x + 1));
    }

    void increment() {
        c++;
        if(next != null)
            next.increment();
    }

    public String toString() {
        String s = ":" + c;
        if(next != null)
            s += next.toString();
        return s;
    }

    @Override
    public Object clone() {
        Snake o = null;
        try {
            o = (Snake)super.clone();
        } catch(CloneNotSupportedException e) {
            System.err.println("Змея не может быть клонирована");
        }

        Snake tmp = next;

        while (tmp != null)
        {
            o.next = (Snake)tmp.clone();
            tmp = tmp.tmp;
        }

        return o;
    }
    public static void main(String[] args) {
        Snake s = new Snake(5, 'a');
        System.out.println("s = " + s);
        Snake s2 = (Snake)s.clone();
        System.out.println("s2 = " + s2);
        s.increment();
        System.out.println("after s.increment, s = " + s);
        System.out.println("after s.increment, s2 = " + s2);

    }
}
pro100boy
Уровень 41
23 августа 2015, 14:56
Кручусь вокруг да около… Никак не могу отойти от этого шаблона.


    @Override
    public Object clone() {
        Snake o = null;
        try {
            o = (Snake)super.clone();
        } catch(CloneNotSupportedException e) {
            System.err.println("Змея не может быть клонирована");
        }

        while (next != null)
        {
            o.next = (Snake)next.clone();
            next = next.next;
        }

        return o;
    }