Добавление LinkedList в LinkedList, который содержит LinkedList и изменение добавленного LinkedList - PullRequest
0 голосов
/ 01 июля 2019

Я хочу добавить LinkedList<Integer> (назовем это списком A) к LinkedList<LinkedList<Integer>> (назовем это списком B).После этого мне нужно изменить значения списка A и снова добавить его в список B, но без изменения значений, уже сохраненных в списке B.

Мне нужно это для хранения неизвестного количества путей в LinkedListсодержащий LinkedLists.Количество LinkedList, которые должны быть добавлены в список B, всегда различно, и я не могу просто работать с LinkedList<Integer> C, который копирует A. В большинстве случаев мне, вероятно, понадобится много списков в списке B.

public static void main(String[] args) 
{
    LinkedList<LinkedList<Integer>> B = new LinkedList<LinkedList<Integer>>();
    LinkedList<Integer> A = new LinkedList<Integer>();

    // just adding some numbers to List A
    A.add(1);
    A.add(2);
    A.add(3);

    // adding list A to list B
    B.add(A);

    // adding another number to list A
    A.add(4);

    // this will print out [[1,2,3,4]] now
    // I want it to print out [[1,2,3]], even though I changed List A
    System.out.println(B);
}

Текущий результат:

[[1, 2, 3, 4]];

Ожидаемый результат:

[[1,2,3]]

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Приведенный ниже код скопирует все содержимое предыдущего списка, сохраненного в B, через Collections.copy, и предоставит вам право изменять содержимое списка A, не затрагивая значения списков, хранящихся в B.

public static void main(String[] args) {
    LinkedList<LinkedList<Integer>> B = new LinkedList<LinkedList<Integer>>();
    for (int i = 0; i < listsGiven.size(); i++) {
        LinkedList<Integer> A = listsGiven.get(i);
        successiveCopy(B, A, i);
    }
}

static void successiveCopy(LinkedList<LinkedList<Integer>> B, LinkedList<Integer> A, int index) {
    if (B.size() == 0) { 
        B.add(A); return; 
    }
    B.add(Collections.copy(A, B.get(index - 1));
}
0 голосов
/ 22 июля 2019

Лично я бы скопировал при добавлении во внешний список.

B.add(new LinkedList<>(A));

Таким образом, копирование связано с причиной, по которой копирование необходимо: вы хотите сохранить текущее состояние списка. Затем вы можете безопасно изменить исходный список.

0 голосов
/ 01 июля 2019

Вы можете сделать что-то вроде этого,

 A = new LinkedList<Integer>();
 A.add(4);

Код, почему он ведет себя так: Вы добавляете ссылку на связанный список a в b таквсе изменения, которые вы внесли в a , будут отражены в b.

...