2016-04-22 20 views
1

Hallo Ich schrieb einen kleinen Codeausschnitt mit HashMap von Java. Mein Ziel ist es, aus einer Datei zu lesen und die Häufigkeit verschiedener Zeichen in der Datei zu ermitteln. Zum Beispiel in meiner Datei input.txt genannt, habe ich diesen Text:Wird die Methode ContainsKey von HashMap in Java nach einer Ganzzahl suchen, wenn ich ein Zeichen darin lege?

ppp-iii 

Die Ausgabe in etwa so gedruckt werden soll.

p : 3 
i : 3 
- : 1 

Aber ich bekomme immer wieder diese

p : 1 
i : 1 
- : 1 

Hier ist mein Code:

public class Apples { 

    public static void main(String[] args) throws FileNotFoundException, IOException { 
     RandomAccessFile fr = new RandomAccessFile("input.txt", "r"); 
     HashMap<Character, Integer> charFreqMap = new HashMap<Character, Integer>(); 
     int ch; 
     while((ch = fr.read()) != -1){ 
      if(!charFreqMap.containsKey(ch)){ 
       charFreqMap.put((char)ch, 1); 
       /* I am reading an int ch, but I am adding a typecasted char ch to the 
       hashmap, so maybe my hashmap is never going to else block.*/ 
      } 
      else{ 
       int prev = charFreqMap.get(ch); 
       charFreqMap.remove(ch); 
       prev = prev + 1; 
       charFreqMap.put((char)ch, prev); 
      } 
     } 
     fr.seek(0); 
     for(Map.Entry<Character, Integer> kv: charFreqMap.entrySet()){ 
      System.out.println(kv.getKey()+"\t:\t"+kv.getValue()); 
     } 
    } 
} 

Also ich brauche Hilfe, damit ich die richtige Ausgabe drucken, wobei jedes Zeichen in meiner Datei bekommt lesen und es wird die Anzahl der Vorkommen (dh die Häufigkeit) korrekt ausgedruckt.

+1

Übrigens müssen Sie 'charFreqMap.remove (ch);'. 'Map.put' ersetzt immer den Wert, wenn Sie es erneut eingeben. –

+3

'containsKey ((char) ch)' und 'get ((char) ch)'. Ein int würde mit einer Ganzzahl eingerahmt werden, und Ganzzahlen sind nicht gleich Zeichen. –

+2

Autoboxing arbeitet mit dem entsprechenden Referenztyp. Wenn Sie ein "Char" einrahmen, wird es zu einem "Character". Wenn Sie ein "int" boxen, wird es zu einem "Integer". Ein 'Zeichen' ist niemals gleich 'Integer' und ein' Integer' ist niemals gleich' Zeichen'. – Savior

Antwort

0

Sie sollten int zu char vor jedem Eingriff mit einem Schlüssel durchführen werfen, weil nur char zu Character eingerahmt wird.

while((ch = fr.read()) != -1) { 
    char c = (char) ch; 
    charFreqMap.put(c, charFreqMap.containsKey(c) ? charFreqMap.get(c) + 1 : 1); 
} 

Es funktioniert gut und ergibt folgendes Ergebnis:

{p = 3, i = 3, - = 1} 
+0

Tut mir leid, habe ich nicht. Ich überprüfe immer noch deinen Code. – theprogrammer094

+0

Ich vermute, es war jemand anderes, der deine Antwort abgelehnt hat. – theprogrammer094

+0

Ja, es funktioniert. Vielen Dank. – theprogrammer094

1

Nein, und Ihr Beispiel Ausgabe zeigt deutlich, dass :)

Beachten Sie, dass Map.get und Map.containsKeyObject nehmen, nicht den Schlüsseltyp als Parameter.

Wenn Sie eine int Variable übergeben, wird diese in den Bereich Integer eingereiht.

Wenn Sie Character Instanzen in die Karte eingefügt haben, ist keine dieser Instanzen Integer s. Sowohl Integer als auch Character melden sich nur dann als gleich Integer oder Character, selbst wenn Character.intValue() == Integer.intValue().

Sie müssen den Parameter an einen char in den get und containsKey Aufrufe umwandeln, damit es wie erwartet funktioniert.

+0

Danke für deine Antwort. Ich habe jetzt den Unterschied verstanden. – theprogrammer094