Не удается добавить к scala изменчивому LinkedList?
Я смотрю API, а метод: + возвращает новый LinkedList. Метод append позволяет только добавить другой связанный список. Метод + = должен работать var. Зачем кому-то когда-либо понадобится, если 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, если это вообще возможно.
Ответ 4
Во-первых, обратите внимание на документы:
Этот класс реализует одиночные связанные списки, где и голова (elem) и хвост (следующий) изменяемы.
То, что он дает вам, изменено head
и tail
. Эти операции представлены тремя способами:
-
append
и insert
изменить tail
, поэтому они получают LinkedList
как аргумент
-
update
измените head
элемента.
Если вам нужен класс, который может расти, посмотрите на классы, расширяющие Growable
.