0

基本的に、文字列をキー (単一文字) と整数変数 (文字頻度) として使用してマップを実装しようとしています。

プログラムを実行すると、不正確な周波数が得られます。誰かが私が間違っているところを見ていますか?

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


public class WordCount {

    public static void main(String[] args) throws FileNotFoundException{
        File f1 = new File("article.txt");
        Scanner scan = new Scanner(f1).useDelimiter("|");

        Map<String, Integer> wordMap = new HashMap<String, Integer>();
        String letter;
        Integer value = 0;

        while(scan.hasNext()){

            letter = scan.next();

            if(wordMap.containsKey(letter)) wordMap.put(letter, value++);

            else wordMap.put(letter, new Integer(value++));
        }
        System.out.println(wordMap);


    }

}
4

2 に答える 2

3

問題はここにあるようです:

while(scan.hasNext()){
    letter = scan.next();

    if(wordMap.containsKey(letter)) wordMap.put(letter, value++);  // problem

    else wordMap.put(letter, new Integer(value++));
}

if ステートメントは次のようになります。

if (wordMap.containsKey(letter)) {
    Integer prev = wordMap.get(letter);
    wordMap.put(letter, prev++);
}  else {
    wordMap.put(letter, 1);
}

ただし、もう少し良くするために、次のように、マップ上で 1 つのルックアップを実行するだけで済みます。

Integer prev = wordMap.get(letter);
if (prev == null) {
    wordMap.put(letter, 1);
}  else {
    wordMap.put(letter, prev++);
}
于 2013-04-12T01:03:29.480 に答える
1

このビットは間違っています

    Integer value = 0;

    while(scan.hasNext()){

        letter = scan.next();

        if(wordMap.containsKey(letter)) wordMap.put(letter, value++);

        else wordMap.put(letter, new Integer(value++));
    }

する必要があります

    while(scan.hasNext()){

        letter = scan.next();

        //get current count
        int value;
        if(wordMap.containsKey(letter)){
            value = wordMap.get(letter);
        }else {
            value = 0;
        }
        // increment count
        value++;
        wordMap.put(letter, value);
    }

値をマップなどに入れてもリセットされないか、魔法のようにプロパティを必要なものに再同期する (少なくとも Java ではそうではない) ため、変更するたびにマップから値を取得する必要があります。 .

それ以外の場合は、ランダムな値をマップに配置するだけです。あなたのバージョンでは、文字の最後のインスタンスが検出されたときの文字数です。

于 2013-04-12T01:02:51.460 に答える