Не можете добавить в изменчивый LinkedList Scala? - PullRequest
13 голосов
/ 09 ноября 2011

Я смотрю на API и метод: + возвращает новый LinkedList.Метод добавления разрешит добавление только другого связанного списка.Методу + = нужен var для работы.Зачем кому-то это нужно, если LinkedList изменчив?Что это за сумасшествие?

Если бы у меня было что-то подобное в Java

final LinkedList myList = new LinkedList<String>();
mylist.add("balh");

Как мне добиться того же в Scala?

Ответы [ 4 ]

10 голосов
/ 09 ноября 2011

Если append может принимать только LinkedList, то почему бы не использовать

mylist append LinkedList("something")

или

mylist append LinkedList(otherContainer: _*)

Есть причина, по которой я могу разрешить только LinkedList s в append, я думаю, потому что это гарантирует следующее:

l1 = LinkedList(1, 2, 3)
l2 = LinkedList(4)
l3 = LinkedList(5)

l1 append l2
// l1 == LinkedList(1, 2, 3, 4)
// l2 == LinkedList(4)

l2 append l3
// l1 == LinkedList(1, 2, 3, 4, 5)
// l2 == LinkedList(4, 5)
// l3 == LinkedList(5)
7 голосов
/ 09 ноября 2011

Вы можете использовать Buffer для построения ваших значений и преобразования их в структуру данных, используя mapResult.

//Create a buffer which will build a linked list
val buf = new ArrayBuffer[String]  mapResult { xs => LinkedList( xs:_* ) }

//You can append elements with +=, it is overriden to allow its use on a val
buf += "Something"
buf += "else"

//At the end you get your list
val lst = buf.result

// lst ==  LinkedList(Something, else) 
3 голосов
/ 09 ноября 2011

Изменчивость относится к фактическим элементам в списке, а не к структуре, которая есть в списке (постоянство).Об этом также говорится в скалярном документе.

Если возвращать новый список каждый раз не то, что вам нужно, и вы не можете использовать var, вы всегда можете использовать Java LinkedList.

val mylist = new java.util.LinkedList[String]
mylist add "something"

Я бы придерживался списков Scala, если это вообще возможно.

2 голосов
/ 09 ноября 2011

Во-первых, пожалуйста, уделите больше внимания документации:

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

Итак, то, что оно дает вам, является изменчивым head и tail. Эти операции представлены тремя способами:

  • append и insert изменяют tail, поэтому они получают LinkedList в качестве аргумента
  • update изменить head элемента.

Если вы хотите класс, который может расти, посмотрите на классы, расширяющие Growable.

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