附加到匹配

时间:2015-12-08 22:55:25

标签: scala pattern-matching

我目前面临以下问题。

我的代码基本上有以下几种情况:

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

显然不准确,但它的一般要点。它工作正常,但我希望以相反的顺序附加到列表中的值。有什么好办法吗?如果我试图颠倒顺序并执行

,Intellij会抛出错误
this.prev.toList :: this.val

如果我尝试使用像++这样的操作。根据我班级的结构,我想做什么不可能?

我得到的具体错误涉及“无法解析::”或我尝试在this.val之前放置this.prev.toList时使用的任何符号。

是的,“这个”没有必要 - 我把它包括在内,希望能让我的问题更容易理解。

2 个答案:

答案 0 :(得分: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)

然而,在List上预先支付的费用是O(1),但是附加的费用是O(n)!

对于“众多”集合,您可以考虑其他数据结构,如Vector:

  

Vector提供非常快速的追加和前置

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

答案 1 :(得分:0)

您可以使用此方法追加:+

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

但请记住,对于长列表,追加List可能效率非常低。