1

假设我有一个文件,其中包含例如以下类型的数据:

 info1 word1
 info2 word2
 info3 word3
 info2 word4

ETC

现在,我想为每行中的单词创建一个映射函数。所以我最初读了这行,用空格分割它,然后得到这个词。

现在这个词将是价值。我知道所有的词都是不同的和独特的。但是,信息可能不是唯一的。

关于键,因为我最感兴趣的是与每个单词相关的信息,所以我只为它创建一个字符串,它基本上是所有的行。

我知道信息可能没有什么不同,但线条肯定是不同的,因为单词肯定不同。

该文件有 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) {
  }
}

提前致谢

4

4 回答 4

3

如果您有重复的密钥,就会发生这种情况;put将覆盖以前的值。

于 2012-04-16T00:59:35.993 回答
2

您的单词列表很可能实际上并不是唯一的。您可以在致电之前进行检查.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++;
     }
于 2012-04-16T01:01:03.043 回答
0

您可能有重复的键,例如您的示例中的“info2”映射到“word2”和“word4”。

如果您需要映射到多个值的键,则需要一个“multimap”。您可以使用该类型创建自己的类型HashMap<String, Set<String>>(每个键映射到一组值)。或者使用预先存在的一个,例如来自Apache Commons的那个。

使用自己的,每次要添加映射都需要检查key是否存在;如果不将其映射到一个空集。然后添加映射,将值放入该键的集合中。

HashMap<String, Set<String>> info;
...
if (!info.contains(lineData[1])) {
    info.put(lineData[1], new HashSet<String>());
}
info.get(lineData[1]).put(line);
于 2012-04-16T01:07:48.693 回答
0

您可能确实有一些重复的键。

检查是否要替换以前的值的一种简单方法是查看 的返回值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);
于 2012-04-16T01:03:36.250 回答