Как Вы добавляете элемент к a List
в Scala 2.7.5, не создавая новое List
и не используя решение устаревшее.
Не рекомендуемый способ добавления элемента в список в Scala 2.7.5?
Этого не существует и никогда не будет.
Как добавить элемент в список в Scala 2.7.5 без создания нового списка и без использования устаревшего решения .
Используйте ::
:
val newList = element :: oldList
Или, если список
является var
,
list ::= element
Он не создает новый List
(хотя он создает новый ::
, также известный как cons ), и добавляет к нему элемент.
Если вы хотите добавить элементы к последовательности без создания новой последовательности, используйте изменяемую структуру данных.
Стоит отметить, что List
имеет очень специфическое значение в scala, которое не эквивалентно java.util .List
интерфейс. Список
- это запечатанный абстрактный класс, представляющий рекурсивную структуру данных, которая имеет заголовок и хвост . (В scala действительно существуют структуры типа списков Java, некоторые из которых являются изменяемыми.)
Списки Scala
являются неизменяемыми ; изменение списка каким-либо образом невозможно, хотя вы можете создать новый список, добавив его к существующему (что возвращает новый объект). Несмотря на то, что они неизменяемы, структура не более дорогая с точки зрения создания объекта, чем, скажем, добавление к java.util.LinkedList
метода +
устарел по уважительной причине, потому что он неэффективен; вместо этого используйте:
val newList = theList ::: List(toAppend)
Я полагаю, что другим способом было бы добавить в начало 2 разворота:
val newList = (toAppend :: theList.reverse).reverse
Я сомневаюсь, что это более эффективно! В общем, если я хочу добавить поведение, я использую prepend , а затем обратный
(при необходимости доступа к списку):
val newList = toAppend :: theList
//much later! I need to send the list somewhere...
target ! newList.reverse
Метод + =
в списке не рекомендуется, поскольку он добавляет элемент в хвост, что является дорогостоящим. Наименее затратный способ добавления элемента в список - добавить его в заголовок с помощью :: =
.
Таким образом, предупреждение об устаревании является тонким намеком на то, что вам следует переделать свою программу для работы, добавив вместо добавления:
scala> var l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)
scala> l ::= 4
scala> l
res1: List[Int] = List(4, 1, 2, 3)
(Обратите внимание, что :: =
и + =
на a var
не настоящие методы, а сахар для l = l :: elem
и т. д.)
Это должно сработать: http://www.scala-lang.org/docu/files/api/scala/collection/mutable/SingleLinkedList.html#append%28This%29
Или это: http://www.scala-lang.org/docu/files/api/scala/collection/mutable/ListBuffer.html#%2B%3A%28A%29
Основной трюк заключается в использовании изменяемого списка (или класса с аналогичной функциональностью)
Вы можете использовать ListBuffer
, который обеспечивает добавление постоянного времени:
val buffer = new scala.collection.mutable.ListBuffer[Int]
buffer += 1
buffer += 2
val list = buffer.toList