List scala中的列表-从右侧获取元素

List scala中的列表-从右侧获取元素,list,scala,List,Scala,我已经开始学习scala,我想知道有没有办法从右边获取列表中的元素 比如说 val myList = List(1, 2, 3, 4, 5) 如果我写myList(-1)我会得到5 有没有什么简单的方法来完成它,否则我将不得不编写自己的函数 myList.last ??请记住,对于列表,此操作的复杂性为O(n)。您也可以简单地反转列表并使用普通索引: myList.reverse(0) ??请记住,对于列表,此操作的复杂性为O(n)。您也可以简单地反转列表并使用普通索引: myList.r

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

比如说

val myList = List(1, 2, 3, 4, 5)
如果我写
myList(-1)
我会得到
5

有没有什么简单的方法来完成它,否则我将不得不编写自己的函数

myList.last
??请记住,对于
列表
,此操作的复杂性为O(n)。您也可以简单地反转列表并使用普通索引:

myList.reverse(0)
??请记住,对于
列表
,此操作的复杂性为O(n)。您也可以简单地反转列表并使用普通索引:

myList.reverse(0)
请注意,myList.length的复杂性为O(n),而查询特定索引的复杂性为O(index)


请注意,myList.length的复杂性为O(n),而查询特定索引的复杂性为O(index)。

Scala的
列表是一个单链接列表,因此对其进行索引查找将是一个线性时间操作。因为您对向后索引感兴趣,所以还必须调用
.length
方法,这也是一种线性时间操作

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

请参阅各种Scala集合的性能特征概述

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

Scala的
列表
是一个单链接列表,因此对其进行索引查找将是一个线性时间操作。因为您对向后索引感兴趣,所以还必须调用
.length
方法,这也是一种线性时间操作

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

请参阅各种Scala集合的性能特征概述

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
做一些类似于:

myList(-n)

您可以定义隐式转换,该转换允许您执行以下操作:

myList.getFromRight(n)

下面是隐式转换的代码。它将在所有seq上创建一个新的getFromRight方法,因此它将处理列表、向量等

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功能,但这是它们的完美用例之一:当一个对象缺少您认为它应该拥有的方法,但使用继承修改它不是一个选项时,您可以使用您想要的方法定义到另一个对象的隐式转换。

要执行以下操作:

myList(-n)

您可以定义隐式转换,该转换允许您执行以下操作:

myList.getFromRight(n)

下面是隐式转换的代码。它将在所有seq上创建一个新的getFromRight方法,因此它将处理列表、向量等

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功能,但这是它们的完美用例之一:当一个对象缺少您认为它应该拥有的方法,但使用继承修改它不是一个选项时,您可以使用您想要的方法定义到另一个对象的隐式转换。

否。如果功能缺失,写一个trait.@Ant:在对象创建时使用,比如带有AddedFunctionalityTrait的新列表
?我不认为从伴随对象(
List(1,2)
,等等)创建对象或者从不受您控制的代码中获取对象会起到很好的作用。不。如果缺少功能,请编写一个trait.@Ant:在对象创建时使用,例如
带有AddedFunctionalityTrait的新列表
?我认为从伴随对象创建对象(
List(1,2)
,等等)或从不受您控制的代码中获取对象不会有什么好处。