Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么HashMap大小与文件中的行数不同?_Java_File_Hashmap - Fatal编程技术网

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个重复项。您应该考虑使用一些数据结构作为值,然后您可以添加到其中。我应该好好检查一下。谢谢大家的评论和回答。