Выбор последнего элемента списка - PullRequest
31 голосов
/ 24 февраля 2011
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 ]

80 голосов
/ 24 февраля 2011

Вы можете использовать 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)) может быть опасным и может привести к бесконечному циклу.

9 голосов
/ 24 февраля 2011

Другая версия без использования last (по какой-либо причине вам это может понадобиться).

def last(L:List[Int]) = L(L.size-1)
7 голосов
/ 24 февраля 2011

Вам лучше сделать:

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

Чище и менее подвержено ошибкам:)

0 голосов
/ 09 сентября 2017

Вот где красота Scala начинает играть!

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

Таким образом вы получите Option из Int.Узнайте больше о в Scala's Option * здесь .

И, наконец, вы можете обработать дело None по своему усмотрению:

val last: Int = lastOption.getOrElse(0) //or however else you want to handle the case of an empty list
0 голосов
/ 08 сентября 2017

Albiet, это очень старый вопрос, может пригодиться, что влияние на голову и последние операции, по-видимому, здесь изложено.

0 голосов
/ 10 августа 2017

Рекурсивная функция последняя должна следовать 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
...