选择列表的最后一个元素

时间:2011-02-24 11:36:11

标签: list scala

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)
     }

此代码有什么问题?

6 个答案:

答案 0 :(得分:80)

如果列表为空,您可以使用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))可能会很危险,并可能导致无限循环。

答案 1 :(得分:9)

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

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

答案 2 :(得分:6)

你最好这样做:

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

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

答案 3 :(得分:0)

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

  • 要求#1。不调用递归的退出条件 进一步发挥作用。

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

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

  1. 使用内置函数last可能不是面试中的一个选项 的问题。
  2. 逆转和头部需要额外的操作,面试官可能要求减少这些操作。
  3. 如果这是没有尺寸成员的自定义链接列表怎么办?
  4. 我会将其更改为如下。

    res0: Int = 3
    

    结果

    MQMessage theMessage    = new MQMessage();
    MQGetMessageOptions mqGetMessageOptions = new MQGetMessageOptions();
    
    mqGetMessageOptions.options=MQC.MQGMO_WAIT | MQC.MQGMO_BROWSE_FIRST;
    mqGetMessageOptions.matchOptions=MQC.MQMO_NONE;
    mqGetMessageOptions.waitInterval=5000;
    try{
            //read the message from queue          
    queue.get(theMessage,mqGetMessageOptions);  
      mqGetMessageOptions.options = MQC.MQGMO_MSG_UNDER_CURSOR;
    
        queue.get(theMessage, mqGetMessageOptions);
    

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

这就是斯卡拉之美的发挥作用!

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

通过这样做,您将获得Option Int。阅读更多关于Scala选项的here

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

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