Не удается добавить к изменяемому LinkedList в scala?

#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 это двусвязный список, который чем-то отличается от Scala LinkedList .

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 .