请问HashMap在java中是否包含key方法,如果我在其中放入一个字符,请检查一个整数?

时间:2016-04-22 15:34:41

标签: java file-io hashmap filereader randomaccessfile

您好我使用java中的input.txt编写了一小段代码。我的目标是从文件中读取并获取文件中不同字符的频率。例如,在我的名为ppp-iii 的文件中,我有这样的文字:

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}}

所以我需要帮助,以便我可以打印正确的输出,其中我的文件中的每个字符都被读取,并且它的出现次数(即它的频率)被正确打印出来。

2 个答案:

答案 0 :(得分:1)

不,您的示例输出清楚地表明:)

请注意,Map.getMap.containsKeyObject作为参数,而不是密钥类型。

当您传递int变量时,该变量会被加到Integer

如果您已将Character个实例放入地图中,那么这些实例都不是Integer。即使IntegerIntegerCharacter也只会将自己报告为等于另一个CharacterCharacter.intValue() == Integer.intValue()

您需要将参数转换为charget来电中的containsKey,以使其按预期运行。

答案 1 :(得分:0)

在使用密钥执行任何操作之前,您应该将int强制转换为char,因为只有char将被装箱到Character

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}