2016-12-07 1 views
1

Ich versuche, einen Schwanz rekursive Methode zu machen, aber ich bin mit Karte und ich weiß nicht, wie Muster zu verwenden Passende zu überprüfen, ob Karte leer/null ist und erhalte Kopf/Schwanz:Scala - Muster Kopf/Schwanz auf der Karte

def aa(a:Map[String, Seq[Operation]]): Map[String, (Seq[Operation], Double)] = { 

    def aaRec(xx:Map[String, Seq[Operation]], 
       res:Map[String, (Seq[Operation], Double)], 
       acc:Double = 0): Map[String, (Seq[Operation], Double)] = xx match { 
     case ? => 
     res 
     case _ => 
     val head = xx.head 
     val balance = head._2.foldLeft(acc)(_ + _.amount) 
     aaRec(xx.tail, res + (head._1 -> (head._2, balance)), balance) 
    } 

    aaRec(a, Map[String, (Seq[Operation], Double)]()) 

    } 
} 

Was auf Fall leer Karte und Fall h :: t die korrekte Syntax ist?

Danken im Voraus

Antwort

3

Ich bin mir nicht sicher, ob es auf einer Karte Mustervergleich möglich ist, aber dieser Code neu geschrieben werden könnte grundlegende combinator Methoden:

def aa(a:Map[String, Seq[Operation]]): Map[String, (Seq[Operation], Double)] = 
    a.mapValues(seq => (seq, seq.map(_.amount).sum)) 
+0

Die übliche Warnung: 'mapValues' gibt einen Blick, wenn Sie also die gleiche Taste mehr als einmal zugreifen,' seq.map (_ Betrag.) .sum' wird jedes Mal berechnet werden. –

6

Map haben keine Ordnung, so dass es hat keine head oder tail. Es hat auch keine unapply/unapplySeq Methode, so dass Sie nicht Pattern-Matching auf einem Map tun können.

Ich denke, mit einem foldLeft gehen könnte die beste Option sein.