2017-12-31 15 views
0

Ich bin neu in Scala und ich lernte etwas über Mustervergleiche in Sammlungen, um eine einfache Logik generisch zu schreiben, um das vorletzte Element zu finden. Hier ist mein erster Versuch:Das vorletzte Element in der Scala-Liste finden

@scala.concurrent.tailrec 
def penultimate[A](elems: List[A]) = elems match { 
    case Nil => None 
    case first :: second :: Nil => Some(first) 
    case head :: tail => penultimate(tail) 
} 

Ist das gut genug? Ich habe von Tail-Rekursionen gelesen und meine Methode zu einem rekursiven Tail gemacht!

vermag jedoch nicht für den folgenden Fall und wo ich erwarte, dass einige (1):

penultimate[Int](List(1)) // This should give me Some(1) 

Gibt es etwas besser, dass ich tun könnte? Ich kann die umgekehrte Methode aus der Scala-Sammlungsbibliothek verwenden und dies zu einem einzigen Liner machen, aber ich wollte mich davon fernhalten.

Gibt es einen besseren Ansatz?

+0

Was Sie sagen, ist nicht korrekt. Erstens: Dein Code kompiliert nicht. Zweitens: Wenn Sie die vorletzten Übersetzungsfehler (Liste (1)) beheben, wird 'None' zurückgegeben. –

+0

Sorry wegen der Verwirrung! Ich habe meinen Beitrag bearbeitet! –

+0

Jetzt bin ich verwirrt. Warum würden Sie _expect_ 'Some (1)'? –

Antwort

1

Ihr Code scheint korrekt zu funktionieren, wenn Sie diese zwei einfachen Kompilierungsfehler beheben. Ein alternativer Weg, um dieses Verfahren zu schreiben ist:

def penultimate[A](elems: List[A]) = elems match { 
    case _ :+ elem :+ _ => Some(elem) 
    case elem +: Nil => Some(elem) // strange extra requirement 
    case _ => None 
} 

:+ eine Seq in dekonstruiert (1) eine Liste von allen außer dem letzten Element, und (2) das letzte Element. Wie :: oder die allgemeinere +: aber rückwärts. Ich hätte case init :+ elem :+ last schreiben können, aber ich bevorzuge es, den Teilen des Musters, die ich nicht verwenden möchte, keine Namen zu geben.

+0

Können Sie mir erklären, wie der erste Fall mit dem vorletzten Element übereinstimmt? –

+0

Ich habe eine Erklärung hinzugefügt. –

Verwandte Themen