从右侧列出scala -getting元素

时间:2012-02-21 18:42:39

标签: list scala

我已经开始学习scala了,我想知道有没有办法从右侧获取List中的元素

例如

val myList = List(1, 2, 3, 4, 5)

如果我写myList(-1),我会得到5

有没有简单的方法来完成它,或者我必须编写自己的函数?

4 个答案:

答案 0 :(得分:4)

myList.last

?请记住,此操作对List具有O(n)复杂度。您也可以简单地反转列表并使用普通索引:

myList.reverse(0)

答案 1 :(得分:1)

Scala的List是一个单链表,因此对它进行索引查找将是一个线性时间操作。由于您对后向索引感兴趣,因此您还必须调用.length方法,这也是线性时间操作。

如果您需要执行索引访问,List可能不是正确的数据结构。您应该使用Vector这是一种具有高效索引访问权限的序列类型(有效地获取恒定时间)。

有关各种Scala集合的性能特征的概述,请参阅this link

scala> val v = Vector(3, 4, 5, 2)
v: scala.collection.immutable.Vector[Int] = Vector(3, 4, 5, 2)

scala> v(v.length - 1)
res21: Int = 2

答案 2 :(得分:0)

myList(myList.length-1-index)

注意myList.length的复杂度为O(n),查询特定索引时有O(索引)。

答案 3 :(得分:0)

做类似的事情:

myList(-n)

您可以定义一个允许您执行的隐式转换:

myList.getFromRight(n)

以下是隐式转换的代码。它将在所有Seqs上创建一个新的getFromRight方法,因此它将在Lists,Vectors等上工作。

implicit def getFromRightImpl[A](s: Seq[A]) = new {
  def getFromRight(n: Int) = s(s.length - n)
}

以下是一些例子:

scala> val v = Vector(1, 2, 3, 4)
v: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4)

scala> val l = List(1, 2, 3, 4)
l: List[Int] = List(1, 2, 3, 4)

scala> v.getFromRight(1)
res4: Int = 4

scala> l.getFromRight(3)
res5: Int = 2

隐式转换是一个相当高级的Scala功能,但这是它们的完美用例之一:当一个对象缺少您认为应该具有的方法时,但是使用继承修改它不是一个选项,您可以定义一个使用您想要的方法隐式转换为另一个对象。