it-swarm.com.de

Das letzte Element einer Liste auswählen

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

für ein Ergebnis oben schrieb ich diesen Code:

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

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

Was ist das Problem mit diesem Code?

26
dondog

Sie können last verwenden, das das letzte Element zurückgibt oder eine NoSuchElementException auslöst, wenn die Liste leer ist. 

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

Wenn Sie nicht wissen, ob die Liste leer ist oder nicht, können Sie die Verwendung von lastOption in Betracht ziehen, die eine Option zurückgibt.

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

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

Ihre Frage betrifft List, aber die Verwendung von last in einer unendlichen Sammlung (z. B. Stream.from(0)) kann gefährlich sein und zu einer Endlosschleife führen.

76
michael.kebe

Eine andere Version ohne last (aus welchem ​​Grund auch immer Sie es benötigen).

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

Sie sollten besser tun:

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

Sauberer und weniger fehleranfällig :)

6
Pere Villega

Die rekursive Funktion sollte zuletzt auf 2 Eigenschaften folgen. Ihre letzte - Funktion hat keine davon.

  • Anforderung Nr. 1. Eine Beendigungsbedingung, die die rekursive Funktion nicht weiter aufruft.

  • Anforderung Nr. 2. Ein rekursiver Aufruf, der die Elemente reduziert, mit denen wir begonnen haben.

Hier sind die Probleme, die ich mit anderen Lösungen sehe.

  1. Die letzte Verwendung der eingebauten Funktion ist möglicherweise keine Option in Interview-Fragen.
  2. Das Umkehren und der Kopf erfordert zusätzliche Operationen, die der Interviewer möglicherweise reduzieren möchte.
  3. Was ist, wenn dies eine benutzerdefinierte verknüpfte Liste ohne das Größenmitglied ist? 

Ich werde es wie folgt ändern.

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

Ergebnis

res0: Int = 3
0
Ravi R

Albiet, dies ist eine sehr alte Frage, es könnte nützlich sein, dass die Auswirkungen auf die Leistung von Kopf- und letzten Operationen hier aufgeführt sind http://docs.scala-lang.org/overviews/collections/performance-characteristics.html .

0
Marton Tatai