2016-04-22 16 views
1

こんにちは、javaのHashMapを使用して小さなスニペットを書いています。私の目的は、ファイルから読み込み、ファイル内の異なる文字の頻度を取得することです。出力はこのような何かを印刷する必要がありますHashMapのcontainsKeyメソッドがjavaにありますか?文字を入れると整数がチェックされますか?

ppp-iii 

:私のファイルの例は、input.txtと呼ばれるために、私はこのテキストを持っています。

p : 3 
i : 3 
- : 1 

しかし、私はここに、この

p : 1 
i : 1 
- : 1 

を得続ける私のコードです:

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()); 
     } 
    } 
} 

私のファイルの各文字が取得する前記私は正しい出力を印刷できるように、だから私は助けを必要とそれは発生回数(すなわち頻度)が正しく出力されます。

+1

あなたは 'charFreqMap.remove(ch);'を実行する必要はありません。 'Map.put'は値を置き換えると常に値を置き換えます。 –

+3

'containsKey((char)ch)'と 'get((char)ch)'です。 int型はIntegerにボックス化され、Integers型はCharactersと等しくありません。 –

+2

オートボクシングは、対応する参照タイプで動作します。 'char'を入力すると' Character'になります。 'int'を指定すると' Integer'になります。 'Character'は決して' Integer'に等しくなく、 'Integer'は決して' Character'に等しくありません。 – Savior

答えて

0

あなただけcharCharacterに箱詰めされますので、キーで任意の操作を実行する前にcharintをキャストする必要があります。

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

それは正常に動作し、以下の結果与えます:いいえ

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

すみませんでした。私はあなたのコードをチェックしています。 – theprogrammer094

+0

あなたの答えを落としたのは他の誰かだったと思います。 – theprogrammer094

+0

はい、動作します。ありがとう。 – theprogrammer094

1

を、そしてあなたの例の出力は明らかに

お知らせそのMap.getMap.containsKeyは、ないキータイプをObjectを取る:)ことを実証しています、パラメータとして。

int変数を渡すと、ボックスはIntegerになります。

Characterインスタンスをマップに配置している場合、そのインスタンスはいずれもIntegerです。 IntegerCharacterの両方は、たとえCharacter.intValue() == Integer.intValue()であっても、それぞれ別のIntegerまたはCharacterに等しいと報告されます。

getcontainsKeyの呼び出しでパラメータをcharにキャストする必要があります。

+0

あなたの答えをありがとう。私は今、その違いを理解しています。 – theprogrammer094

関連する問題