#scala #scala-collections #mutable
#scala #scala-коллекции #изменяемый
Вопрос:
Я смотрю на API, и метод: возвращает новый LinkedList. Метод append разрешает добавление только другого связанного списка. Для работы метода = требуется переменная. Зачем кому-либо вообще это нужно, если LinkedList изменяемый? Что это за безумие?
Если бы у меня было что-то подобное в Java
final LinkedList myList = new LinkedList<String>();
mylist.add("balh");
Как мне добиться того же в Scala?
Ответ №1:
Если append
можно использовать только LinkedList
, то почему бы не использовать
mylist append LinkedList("something")
или
mylist append LinkedList(otherContainer: _*)
Я думаю, есть причина для разрешения только других LinkedList
файлов в 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)
Ответ №2:
Вы можете использовать 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:
Изменчивость относится к фактическим элементам в списке, а не к структуре, которую имеет список (постоянство). Это также указано в scaladoc.
Если возвращать новый список каждый раз — это не то, что вам нужно, и вы не можете использовать var, вы всегда можете использовать Java LinkedList
.
val mylist = new java.util.LinkedList[String]
mylist add "something"
Я бы придерживался списков Scala, если это вообще возможно.
Комментарии:
1. Обратите внимание, что
java.util.LinkedList
это двусвязный список, который чем-то отличается от ScalaLinkedList
.2. Другой вариант — использовать
scala.collection.mutable.ListBuffer[A]
, а затем.toList
, когда вы хотитеList
.3. @Debilski в каких аспектах отличается? Я спрашиваю, потому что я не могу понять, какую реализацию списка Scala предоставляет при вводе
List(1, 2, 3)
. Является ли список односвязным? Или список с двойной связью?4.
List
(=scala.collection.immutable.List
) является неизменяемым односвязным списком.
Ответ №4:
Во-первых, пожалуйста, уделите больше внимания документам:
Этот класс реализует односвязные списки, в которых изменяемыми являются как head (элемент), так и tail (следующий).
Итак, что это дает вам, это изменяемый head
и tail
. Эти операции представлены тремя методами:
append
иinsert
изменитеtail
, чтобы они получалиLinkedList
в качестве аргументаupdate
изменитеhead
элемент.
Если вам нужен класс, который может расти, посмотрите на расширяющиеся классы Growable
.