簡體   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