java 中 HashMap 的 containsKey 方法,如果我在其中放入一个字符,是否会检查整数?
Will HashMap's containsKey method in java, check for an integer if I put a character in it?
您好,我使用 java 中的 HashMap
编写了一小段代码。我的目标是从文件中读取并获取文件中不同字符的频率。例如,在我名为 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());
}
}
}
所以我需要帮助,以便我可以打印正确的输出,其中我的文件中的每个字符都被读取并且它的出现次数(即它的频率)被正确打印出来。
您应该在使用键执行任何操作之前将 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}
不,您的示例输出清楚地表明:)
注意 Map.get
和 Map.containsKey
将 Object
作为参数,而不是密钥类型。
当您传递一个 int
变量时,它被装箱到 Integer
。
如果您已将 Character
个实例放入地图中,则其中 none 个实例是 Integer
个。即使 Character.intValue() == Integer.intValue()
.
您需要在 get
和 containsKey
调用中将参数转换为 char
才能使其按预期工作。
您好,我使用 java 中的 HashMap
编写了一小段代码。我的目标是从文件中读取并获取文件中不同字符的频率。例如,在我名为 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());
}
}
}
所以我需要帮助,以便我可以打印正确的输出,其中我的文件中的每个字符都被读取并且它的出现次数(即它的频率)被正确打印出来。
您应该在使用键执行任何操作之前将 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}
不,您的示例输出清楚地表明:)
注意 Map.get
和 Map.containsKey
将 Object
作为参数,而不是密钥类型。
当您传递一个 int
变量时,它被装箱到 Integer
。
如果您已将 Character
个实例放入地图中,则其中 none 个实例是 Integer
个。即使 Character.intValue() == Integer.intValue()
.
您需要在 get
和 containsKey
调用中将参数转换为 char
才能使其按预期工作。