2013-08-02 9 views
7

Questa riga: var counter : Integer = jm.get(ls) nel seguente codice restituisce un numero intero di valore 0 quando deve essere nullo. Perché sta succedendo?get metodo di hashmap non restituisce null

In base alla documentazione, il metodo get di HashMap restituisce null se l'elemento non viene trovato. Il codice qui sotto sta contando il numero di elementi in una lista

import scala.collection.JavaConversions._ 

object Tester { 

    def main(args: Array[String]) { 


    var listOfLinks : java.util.Set[String] = new java.util.TreeSet[String] 
    listOfLinks.add("1") 
    listOfLinks.add("1") 
    listOfLinks.add("1") 
    listOfLinks.add("2") 
    listOfLinks.add("3") 
    listOfLinks.add("3") 
    listOfLinks.add("3") 
    listOfLinks.add("3") 

    var l: java.util.List[String] = new java.util.ArrayList[String] 
    var jm: java.util.Map[String, Int] = new java.util.HashMap[String, Int]; 

    for (ls <- listOfLinks) { 
     var counter : Integer = jm.get(ls) 
     if (counter == null) { 
     jm.put(ls, 1) 
     } else { 
     counter = counter + 1 
     jm.put(ls, counter) 
     } 
    } 

    for(jmv <- jm){ 
     println(jmv._1+" , "+jmv._2) 
    } 
    } 

} 
+0

Questa è solo una congettura, ma io * penso * che il valore predefinito di 'Int' in Scala sia 0, non' null'. Anche 'null.asInstanceOf [Int]' restituisce '0'. Quindi, quando il valore non viene trovato, 'null' cambia in' 0' ... –

+0

Non è direttamente correlato alla tua domanda, ma se hai bisogno di contare le occorrenze di elementi in una lista dai un'occhiata a [questa discussione] (http://stackoverflow.com/questions/11448685/scala-how-can-i-count-the-number-of-occurrences-in-a-list) – mariosangiorgio

+0

Sopra il codice, anche se io uso 'Int' invece di 'String' in' jm', funziona ancora. 'jm.get (1)' mi restituisce '0'. Come sta prendendo jm Int quando si tratta di una HashMap di String, Int – Jatin

risposta

2
var jm: java.util.Map[String, Int] = new java.util.HashMap[String, Int]; 

Qui nell'interfaccia mappa che si sta utilizzando come chiave String il valore è Int. Così Int valore predefinito è il 0.

var counter : Integer = jm.get(ls) 

Così qui contatore può contenere solo 0 valore perché nel valore del contatore variabile non venire chiave.

jm.get(ls); 
1

In Scala, Int è il AnyVal tipo (tipo di primitiva). Non può essere nullo.