1

たとえば、次の種類のデータを含むファイルがあるとします。

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

前もって感謝します

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

おそらくいくつかの重複したキーがあります

以前の値を置き換えているかどうかを確認する簡単な方法は、次の戻り値を確認することです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 に答える
0

たとえば、例の「info2」は「word2」と「word4」にマップされます。

複数の値にマップするキーが必要な場合は、「マルチマップ」が必要です。タイプを使用して独自のものを作成できますHashMap<String, Set<String>>(各キーは一連の値にマップされます)。または、 Apache Commonsのものなど、既存のものを使用します。

独自のものを使用して、マッピングを追加するたびに、キーが存在するかどうかを確認する必要があります。そうでない場合は、空のセットにマッピングを追加します。次に、マッピングを追加するには、値をそのキーのセットに入れます。

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 に答える