Не удержанный от использования способ добавить элемент к Списку в Scala 2.7.5?

Как Вы добавляете элемент к a List в Scala 2.7.5, не создавая новое List и не используя решение устаревшее.

9
задан oxbow_lakes 8 February 2010 в 15:45
поделиться

5 ответов

Не рекомендуемый способ добавления элемента в список в Scala 2.7.5?

Этого не существует и никогда не будет.

Как добавить элемент в список в Scala 2.7.5 без создания нового списка и без использования устаревшего решения .

Используйте :: :

val newList = element :: oldList

Или, если список является var ,

list ::= element

Он не создает новый List (хотя он создает новый :: , также известный как cons ), и добавляет к нему элемент.

Если вы хотите добавить элементы к последовательности без создания новой последовательности, используйте изменяемую структуру данных.

15
ответ дан 4 December 2019 в 05:56
поделиться

Стоит отметить, что 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
17
ответ дан 4 December 2019 в 05:56
поделиться

Метод + = в списке не рекомендуется, поскольку он добавляет элемент в хвост, что является дорогостоящим. Наименее затратный способ добавления элемента в список - добавить его в заголовок с помощью :: = .

Таким образом, предупреждение об устаревании является тонким намеком на то, что вам следует переделать свою программу для работы, добавив вместо добавления:

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 и т. д.)

2
ответ дан 4 December 2019 в 05:56
поделиться

Это должно сработать: 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

Основной трюк заключается в использовании изменяемого списка (или класса с аналогичной функциональностью)

1
ответ дан 4 December 2019 в 05:56
поделиться

Вы можете использовать ListBuffer , который обеспечивает добавление постоянного времени:

val buffer = new scala.collection.mutable.ListBuffer[Int]
buffer += 1
buffer += 2
val list = buffer.toList
24
ответ дан 4 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: