繁体   English   中英

选择列表的最后一个元素

[英]Choosing the last element of a list

scala> last(List(1, 1, 2, 3, 5, 8))
res0: Int = 8

为了得到上面的结果,我写了这段代码:

val yum = args(0).toInt
val thrill: 

def last(a: List[Int]): List[Int] = {
     println(last(List(args(0).toInt).last)
     }

这段代码有什么问题?

如果列表为空,则可以使用last ,它返回最后一个元素或抛出NoSuchElementException

scala> List(1, 2, 3).last
res0: Int = 3

如果您不知道列表是否为空,您可以考虑使用lastOption ,它返回一个Option

scala> List().lastOption
res1: Option[Nothing] = None

scala> List(1, 2, 3).lastOption
res2: Option[Int] = Some(3)

你的问题是关于List ,但是在无限集合中使用last (例如Stream.from(0) )可能很危险并且可能导致无限循环。

另一个版本没有使用last (无论出于何种原因你可能需要它)。

def last(L:List[Int]) = L(L.size-1)

你应该做得更好:

 val a = List(1,2,3) //your list
 val last = a.reverse.head

更清洁,更不容易出错:)

递归函数last应该遵循2个属性。 你的上一个功能没有任何一个。

  • 要求#1。 退出条件,不会进一步调用递归函数。

  • 要求#2。 递归调用,减少了我们开始使用的元素。

以下是我在其他解决方案中遇到的问题。

  1. 使用内置函数last可能不是面试问题的选项。
  2. 逆转和头部需要额外的操作,面试官可能会要求减少这些操作。
  3. 如果这是没有大小成员的自定义链接列表怎么办?

我将其更改为如下。

def last(a: List[Int]): Int = a match {
  //The below condition defines an end condition where further recursive calls will not be made. requirement #1
  case x::Nil => x
  //The below condition reduces the data - requirement#2 for a recursive function.
  case x:: xs => last(xs)
}

last(List(1,2,3))

结果

res0: Int = 3

Albiet这是一个非常古老的问题,它可能会很方便,头部和最后一次操作的性能影响似乎在这里列出http://docs.scala-lang.org/overviews/collections/performance-characteristics.html

这就是斯卡拉的美丽发挥作用的地方!

val l: List[Int] = List(1,2,3,4)
val lastOption: Option[Int] = l.lastOption

通过这样做,您将获得IntOption 阅读更多有关Scala选项的信息

最后,您可以随意处理None案例:

val last: Int = lastOption.getOrElse(0) //or however else you want to handle the case of an empty list

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM