2015-12-08 3 views
0

В настоящее время у меня возникает следующая проблема.Добавление к шаблону списка

У меня есть код, который по существу имеет следующие случаи:

val toList = this.toString.match { 
    case "" => List[MyType]() 
    case _ => this.val :: this.prev.toList 
} 

Очевидно не точен, но его общая суть. Он отлично работает, но я хочу, чтобы значения были добавлены в список в обратном порядке. Есть ли хороший способ сделать это? Intellij бросает ошибки, если я пытаюсь изменить порядок и сделать

this.prev.toList :: this.val 

, а также, если я пытаюсь использовать такие операции, как ++. Я пытаюсь сделать невозможным, основываясь на структуре моего класса?

Специфические ошибки, которые я получаю, связаны с «не могу разрешить ::» или любым другим символом, который я использую, когда пытаюсь поместить this.prev.toList до this.val.

И да, «это» не обязательно, я включил его, надеюсь, облегчить понимание проблемы.

ответ

4

:: добавляет элемент в начале этого списка

scala> 1 :: List(2,3) 
List(1, 2, 3) 

+: является эквивалентом ::

scala> 1 +: List(2,3) 
List(1, 2, 3) 

:+ дописывания элемента в конец списка

scala> List(1,2) :+ 3 
List(1, 2, 3) 

Howev стоимость приставки в списке - O (1), но добавочный - O (n)!

Для "многочисленных" коллекции можно рассмотреть другие, как структура данных Vector:

Vector обеспечивает очень быстрое добавление и предварять

http://www.scala-lang.org/api/2.11.7/index.html#scala.collection.immutable.Vector

+0

Спасибо! Обычно я использую вектор, но назначение требует использования списка, поэтому я решил не вмешиваться в разные коллекции. –

+1

Если назначение, которое вы должны использовать 'List', возможно, пытается заставить вас подойти к решению с помощью' :: 'и рекурсии ... –

0

Вы можете добавить с помощью этого метода :+:

this.prev.toList :+ this.val // is `val` really then name? 

Но имейте в виду, что добавление к List может быть очень неэффективным для длинных списков.