2012-05-13 3 views
1

je le code suivantListe Scala numéro d'impression - IntelliJ IDEA

object DispatchLibrary 
{ 
    private var nodes = Map.empty[java.util.UUID, List[BigInt]] 

    def addNode(uuid: java.util.UUID) = if(nodes contains uuid) nodes else (nodes += (uuid -> Nil)) 

    def addValue(uuid: java.util.UUID, value: BigInt) = nodes + (uuid -> (value :: (nodes get uuid getOrElse Nil))) 

    //def getValue(uuid: java.util.UUID) : List[BigInt] = ??? 

    //def getValues() : List[BigInt] = ??? 

    def calculated(): Boolean = !nodes.exists(_._1 eq null) 

    def main(args: Array[String]) : Unit = 
    { 
    val uuid = java.util.UUID.randomUUID() 

    addNode(uuid) 
    addValue(uuid, BigInt(999)) 
    addValue(uuid, BigInt(9999)) 

    nodes foreach {case (key, value) => println (key + "->" + value)} 
    } 
} 

Exécution du code ci-dessus dans IntelliJ IDEA donne quelque chose de similaire à la sortie suivante

8b2b4a7b-3e65-4de0-9035-8ee1d2910983->List() 

Je ne sais pas pourquoi la La liste n'est pas imprimée.

Exécution d'un code similaire de la REPL donne le résultat attendu

scala> var nodes = Map.empty[Int, List[BigInt]] 
nodes: scala.collection.immutable.Map[Int,List[BigInt]] = Map() 

scala> nodes += (1->Nil) 

scala> nodes += (1 -> (BigInt(999) :: (nodes get 1 getOrElse Nil))) 

scala> nodes += (1 -> (BigInt(9999) :: (nodes get 1 getOrElse Nil))) 

scala> nodes foreach {case (key, value) => println (key + "-->" + value)} 
1-->List(9999, 999) 

Je vous serais reconnaissant aussi si vous pouviez me aider à écrire les méthodes commentaires.

Répondre

4

Dans votre méthode addValue, vous écrivez nodes + (uuid -> (value :: (nodes get uuid getOrElse Nil))) qui ne modifie pas la liste dans nodes, mais crée uniquement une nouvelle copie avec la valeur ajoutée. Puisque Map est immuable par défaut, vous devrez le stocker comme vous le faites avec le = -sign dans la méthode addNode.

La raison pour laquelle il imprime quelque chose est parce que la première entrée se compose d'un UUID (String) et Nil (Liste vide). Le "8b2b4a7b-3e65-4de0-9035-8ee1d2910983" a du sens alors parce que c'est l'UUID. Le "List()" est le résultat de l'impression Nil (puisqu'il s'agit d'une liste vide).

Et là vous l'avez. Essayez d'écrire node += ... dans le addValue à la place.

+0

Je ne peux pas croire ce que les petites erreurs peuvent faire. Merci :) – Nabegh

+0

Qu'en est-il de la deuxième partie de la question. J'essaie d'écrire des méthodes 'getValues ​​()' qui devraient retourner une liste de toutes les valeurs – Nabegh

+0

@Nabegh 'def getValue (uuid: java.util.UUID) = nœuds (uuid)' et 'def getValues ​​= nodes.values. flatten' – elbowich