web-dev-qa-db-fra.com

Choisir le dernier élément d'une liste

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

pour avoir un résultat ci-dessus, j'ai écrit ce code:

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

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

Quel est le problème avec ce code?

26
dondog

Vous pouvez utiliser last, qui retourne le dernier élément ou jette une NoSuchElementException, si la liste est vide. 

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

Si vous ne savez pas si la liste est vide ou non, vous pouvez envisager d'utiliser lastOption, qui renvoie Option.

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

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

Votre question concerne List, mais l'utilisation de last sur une collection infinie (par exemple, Stream.from(0)) peut être dangereuse et entraîner une boucle infinie.

76
michael.kebe

Une autre version sans utiliser last (pour une raison quelconque, vous pourriez en avoir besoin).

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

Tu ferais mieux de faire:

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

Plus propre et moins sujet aux erreurs :)

6
Pere Villega

La dernière fonction récursive devrait suivre 2 propriétés. Votre dernier fonction n'en a aucun.

  • Exigence n ° 1. Une condition de sortie qui n'appelle pas la fonction récursive Plus loin.

  • Exigence n ° 2 Un appel récursif qui réduit les éléments avec lesquels nous avons commencé.

Voici les problèmes que je vois avec d'autres solutions.

  1. Utiliser la fonction intégrée en dernier peut ne pas être une option dans les questions d’entrevue.
  2. Le retournement et la tête nécessitent des opérations supplémentaires que l’enquêteur peut demander de réduire.
  3. Que se passe-t-il s'il s'agit d'une liste liée personnalisée sans le membre de taille? 

Je vais le changer comme ci-dessous.

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

Résultat

res0: Int = 3
0
Ravi R

Albiet, c’est une question très ancienne, il est peut-être utile de penser que l’impact des performances de la tête et des dernières opérations semble être exposé ici http://docs.scala-lang.org/overviews/collections/performance-characteristics.html .

0
Marton Tatai