Java 为什么HashMap大小与文件中的行数不同?
假设我有一个包含以下类型数据的文件:Java 为什么HashMap大小与文件中的行数不同?,java,file,hashmap,Java,File,Hashmap,假设我有一个包含以下类型数据的文件: info1 word1 info2 word2 info3 word3 info2 word4 等 现在,我想为每行中的单词创建一个映射函数。所以我开始读这行,用空格分开,然后得到单词 现在这个词就是价值所在。我知道所有的词都是不同的和独特的。但是,信息可能不是唯一的 关于键,因为我最感兴趣的是与每个单词相关的信息,所以我只为它创建一个字符串,它基本上是所有的行 我知道这些信息可能没有什么不同,但行肯定是不同的,因为单词绝对不同 该文件有40000
info1 word1
info2 word2
info3 word3
info2 word4
等
现在,我想为每行中的单词创建一个映射函数。所以我开始读这行,用空格分开,然后得到单词
现在这个词就是价值所在。我知道所有的词都是不同的和独特的。但是,信息可能不是唯一的
关于键,因为我最感兴趣的是与每个单词相关的信息,所以我只为它创建一个字符串,它基本上是所有的行
我知道这些信息可能没有什么不同,但行肯定是不同的,因为单词绝对不同
该文件有40000行,但是HashMap的大小是38490
我不明白这里发生了什么。我的逻辑错了吗
代码如下:
private static void loadInfo(HashMap<String, String> info, File File){
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String[] dataInLine = new String[2];
String line = br.readLine();
int counter = 0;
while (line != null) {
lineData = line.split("\\s+");
info.put(lineData[1], line);
line = br.readLine();
counter++;
}
System.out.println(counter); //counter shows the correct amount of lines
System.out.println(info.size()); //this shows less than the amount of lines
} catch (IOException io) {
}
}
private static void loadInfo(哈希映射信息,文件){
试一试{
BufferedReader br=新的BufferedReader(新文件读取器(文件));
String[]dataInLine=新字符串[2];
String line=br.readLine();
int计数器=0;
while(行!=null){
lineData=line.split(\\s+);
信息输入(行数据[1],行);
line=br.readLine();
计数器++;
}
System.out.println(计数器);//计数器显示正确的行数
System.out.println(info.size());//这显示的行数小于
}捕获(io异常){
}
}
提前感谢如果您有重复的钥匙,就会发生这种情况
put
将覆盖以前的值。如果您有重复的键,则会发生这种情况put
将覆盖上一个值。很可能您的单词列表实际上不是唯一的。您可以在调用.put()
之前进行检查,以确定某个单词是否已存在并报告重复的单词:
while (line != null) {
lineData = line.split("\\s+");
final String word = lineData[1];
final String previous = info.get(word);
if (previous != null) {
System.err.println("Duplicate at count "+line+" of word "+word);
System.err.println(" original line: "+previous);
System.err.println(" new line: "+line);
}
info.put(word, line);
line = br.readLine();
counter++;
}
在所有的可能性中,你的词汇表实际上并不是唯一的。您可以在调用
.put()
之前进行检查,以确定某个单词是否已存在并报告重复的单词:
while (line != null) {
lineData = line.split("\\s+");
final String word = lineData[1];
final String previous = info.get(word);
if (previous != null) {
System.err.println("Duplicate at count "+line+" of word "+word);
System.err.println(" original line: "+previous);
System.err.println(" new line: "+line);
}
info.put(word, line);
line = br.readLine();
counter++;
}
你可能有一些重复的钥匙
检查是否替换以前的值的一种简单方法是查看put
的返回值:
String last = info.put(lineData[1], line);
if( last != null )
System.err.println("Warning: replaced value for key "+lineData[1]+", last value was: "+last);
你可能有一些重复的钥匙
检查是否替换以前的值的一种简单方法是查看put
的返回值:
String last = info.put(lineData[1], line);
if( last != null )
System.err.println("Warning: replaced value for key "+lineData[1]+", last value was: "+last);
您可能有重复的键,例如示例中的“info2”映射到“word2”和“word4” 如果需要具有映射到多个值的键,则需要“多重映射”。您可以使用类型
HashMap
(每个键映射到一组值)创建自己的。或者使用预先存在的一个,例如来自
使用自己的,每次要添加映射时都需要检查密钥是否存在;如果没有,则将其映射到一个空集。然后,要添加映射,请将值放入该键的集合中
HashMap<String, Set<String>> info;
...
if (!info.contains(lineData[1])) {
info.put(lineData[1], new HashSet<String>());
}
info.get(lineData[1]).put(line);
HashMap信息;
...
如果(!info.contains(lineData[1])){
put(lineData[1],new HashSet());
}
info.get(lineData[1]).put(line);
您可能有重复的键,例如示例中的“info2”映射到“word2”和“word4”
如果需要具有映射到多个值的键,则需要“多重映射”。您可以使用类型HashMap
(每个键映射到一组值)创建自己的。或者使用预先存在的一个,例如来自
使用自己的,每次要添加映射时都需要检查密钥是否存在;如果没有,则将其映射到一个空集。然后,要添加映射,请将值放入该键的集合中
HashMap<String, Set<String>> info;
...
if (!info.contains(lineData[1])) {
info.put(lineData[1], new HashSet<String>());
}
info.get(lineData[1]).put(line);
HashMap信息;
...
如果(!info.contains(lineData[1])){
put(lineData[1],new HashSet());
}
info.get(lineData[1]).put(line);
您确定键是唯一的吗?HashMaps中的键是唯一的,因此如果您尝试使用相同的键添加另一行,它将覆盖该位置的值,因此您有40000-38490个重复项。您应该考虑使用一些数据结构作为值,然后您可以添加到其中。我应该好好检查一下。谢谢大家的评论和回答。你确定键是唯一的吗?HashMaps中的键是唯一的,因此如果你尝试用相同的键添加另一行,它只会覆盖该位置的值,因此你有40000-38490个重复项。您应该考虑使用一些数据结构作为值,然后您可以添加到其中。我应该好好检查一下。谢谢大家的评论和回答。