Выбор последнего элемента списка
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)
}
В чем проблема с этим кодом?
Ответы
Ответ 1
Вы можете использовать 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)
) может быть опасным и может привести к бесконечному циклу.
Ответ 2
Другая версия без использования last
(по какой-либо причине вам может понадобиться).
def last(L:List[Int]) = L(L.size-1)
Ответ 3
Вам лучше делать:
val a = List(1,2,3) //your list
val last = a.reverse.head
Более чистый и менее подверженный ошибкам:)
Ответ 4
Последняя рекурсивная функция должна содержать 2 свойства. Ваша последняя функция не имеет ни одного из них.
-
Требование №1. Условие выхода, которое не вызывает рекурсивный
далее.
-
Требование №2. Рекурсивный вызов, который уменьшает элементы, с которых мы начали.
Вот проблемы, которые я вижу с другими решениями.
- Использование встроенной функции в последнем случае может не быть вариантом в интервью
вопросы.
- Реверсирование и голова требуют дополнительных операций, которые может потребовать интервьюер.
- Что делать, если это настраиваемый связанный список без члена размера?
Я изменю его, как показано ниже.
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
Ответ 5
Albiet это очень старый вопрос, может оказаться полезным, что влияние производительности головы и последних операций, как представляется, выложено здесь http://docs.scala-lang.org/overviews/collections/performance-characteristics.html.
Ответ 6
В этом заключается красота Scala!
val l: List[Int] = List(1,2,3,4)
val lastOption: Option[Int] = l.lastOption
Сделав это, вы получите Option
of Int
. Подробнее о Scala Option здесь.
Затем, наконец, вы можете обработать случай None
, как вам угодно:
val last: Int = lastOption.getOrElse(0) //or however else you want to handle the case of an empty list