我已经开始学习scala了,我想知道有没有办法从右侧获取List中的元素
例如
val myList = List(1, 2, 3, 4, 5)
如果我写myList(-1)
,我会得到5
。
有没有简单的方法来完成它,或者我必须编写自己的函数?
答案 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功能,但这是它们的完美用例之一:当一个对象缺少您认为应该具有的方法时,但是使用继承修改它不是一个选项,您可以定义一个使用您想要的方法隐式转换为另一个对象。