Java Beginner: как связать один связанный список с другим? - PullRequest
0 голосов
/ 18 января 2011

Если у меня есть: linkedlist1= 1,2,3,4; и linkedlist2= 5,6,7;

Могу ли я присоединить связанный список 2 к концу связанного списка1 таким образом, если я призываю: linkedlist2.set(0,9999) он меняется на linkedlist2 = [999,6,7] и linkedlist1 становится [1,2,3,4,9999,7,8];?

Возможно ли это?Или мне нужна другая структура?

Следующий код не работал:

 List<Double> l1 = new LinkedList<Double>(Arrays.asList(1.0,2.0));
 List<Double> l2 = new LinkedList<Double>(Arrays.asList(3.0,4.0));
 l1.addAll(l2);
 System.out.println(l1);
 l2.set(0, 9.0);
 System.out.println(l1);

ВЫХОД:

 [1.0, 2.0, 3.0, 4.0]
 [1.0, 2.0, 3.0, 4.0]

Ответы [ 6 ]

5 голосов
/ 18 января 2011

Стандартные классы LinkedList, предоставляемые в Java, не имеют этой возможности.

Когда Донал Бойл публикует сообщения, вы можете добавлять содержимое одного списка в другой, но это не поддерживает связь, как вы описали.

1 голос
/ 18 января 2011

Вы не можете, но в качестве альтернативы вы можете иметь список списка, но я не знаю, будет ли это работать так, как вам нужно:

import java.util.*;
import static java.lang.System.out;
class ListOfLists { 
  public static void main( String ... args ) { 

    List<Integer> a = new LinkedList<Integer>(Arrays.asList(1,2,3,4));
    List<Integer> b = new LinkedList<Integer>(Arrays.asList(5,6,7));  

    List<List> list = new LinkedList<List>();
    list.add( a );
    list.add( b );

    out.println("Before : " + list );
    b.set( 0, 999 );

    out.println("After  : " + list );

  }
}

Before : [[1, 2, 3, 4], [5, 6, 7]]
After  : [[1, 2, 3, 4], [999, 6, 7]]
0 голосов
/ 18 января 2011

Эта проблема кажется хорошим приложением для метода subList (int, int) :

List<Double> l1 = new LinkedList<Double>(Arrays.asList(1.0, 2.0, 3.0, 4.0));
List<Double> l2 = l1.subList(2, 4);

Увы, JavaDoc подсписка гласит:

Семантика списка, возвращаемого этот метод становится неопределенным, если список поддержки (то есть этот список) конструктивно модифицированный любым другим способом чем через возвращенный список. (Структурные модификации таковы что изменить размер этого списка, или иначе возмущать его таким способом что выполняемые итерации могут дать неверные результаты.)

Так что, если вы хотите использовать метод, подобный .add на l1, то вам может не повезти. Фактически, для всех отказоустойчивых классов списков, полученных из AbstractList (например, LinkedList), subList должен выдавать ConcurrentModificationException после структурного изменения родительского списка subList.

Однако, если вы будете держаться подальше от структурных изменений в родительском списке (или если вы заново создадите подсписок после таких изменений), тогда все будет работать как положено.

0 голосов
/ 18 января 2011

Самый простой способ добиться этого - иметь правильный класс для ваших предметов и иметь экземпляры этого класса MyInt, чтобы ссылаться друг на друга вместо того, чтобы полагаться на LinkedList, т.е. добавить поле MyInt next; в пользовательский класс,содержит ваши целые числаЗатем свяжите их, как описано.Изменение одного экземпляра затем может быть выполнено, даже не касаясь структуры списка, и отражается соответствующим образом при переборе по этому списку через next ссылки.

0 голосов
/ 18 января 2011

addAll() просто берет значения из второго связанного списка. Изменения индексов и заданных значений во втором списке не повлияют на первый. (Примечание: изменения в самих объектах останутся, поскольку они оба указывают на один и тот же объект).

Вы можете составить список списков, если это то, что вы ищете.

0 голосов
/ 18 января 2011

Чтобы ответить на вопрос об обновлении одного списка и отображении обновлений, отраженных в другом, ответ зависит от ситуации.

Если вы обновите объект в первом списке, вы увидите изменение.но если вы замените объект, вы не увидите изменения.Вызов .set () в первом списке заменяет объект в списке.К сожалению, невозможно обновить значение примитива (или его представление класса, в данном случае Float) без его замены.

Чтобы добавить два списка, если вы используете java.util.LinkedList,можно позвонить addAll

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