在Hashtable中添加单词频率

时间:2015-05-06 18:12:54

标签: java hashtable

我正在尝试执行一个程序,该程序从文件中获取单词并将它们放入Hashtable中。然后我必须这样做的单词的频率和输出:单词,出现次数。 我知道我的添加方法搞砸了,但我不知道怎么做。我是java的新手。

public class Hash {

private Hashtable<String, Integer> table = new Hashtable<String, Integer>();

public void readFile() {

    File file = new File("file.txt");

    try {

        Scanner sc = new Scanner(file);

        String words;

        while (sc.hasNext()) {
            words = sc.next();
            words = words.toLowerCase();

            if (words.length() >= 2) {
                table.put(words, 1);
                add(words);
            }
        }
        sc.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

public void add(String words) {

    Set<String> keys = table.keySet();
    for (String count : keys) {
        if (table.containsKey(count)) {
            table.put(count, table.get(count) + 1);
        } else {
            table.put(count, 1);
        }
    }
}

public void show() {

    for (Entry<String, Integer> entry : table.entrySet()) {
        System.out.println(entry.getKey() + "\t" + entry.getValue());
    }
}

public static void main(String args[]) {

    Hash abc = new Hash();

    abc.readFile();

    abc.show();
}
}

这是我的file.txt

one one
two
three
two

输出:

two , 2
one , 5
three , 3

3 个答案:

答案 0 :(得分:4)

Set<String> keys = table.keySet();
for (String count : keys) {
    if (table.containsKey(count)) {
        table.put(count, table.get(count) + 1);
    } else {
        table.put(count, 1);
    }
}

现在,您正在递增已经在地图中的键。相反,我不认为你想要循环任何东西,你只想为if增加words条件,我认为实际上只代表一个单词。

if (table.containsKey(words)) {
   table.put(words, table.get(words) + 1);
} else {
   table.put(words, 1);
}

答案 1 :(得分:2)

您可以删除添加功能。在将值设置为1之后,您尝试增加,而不是写入

try (Scanner sc = new Scanner(file)) {
    while (sc.hasNext()) {
        String word = sc.next().toLowerCase();

        if (words.length() >= 2) {
            Integer count = table.get(word);
            table.put(word, count == null ? 1 : (count+1));
        }
    }
}

注意:在Java 8中,您可以在一行中完成所有这些操作,并行处理每一行。

Map<String, Long> wordCount = Files.lines(path).parallel() 
                    .flatMap(line -> Arrays.asList(line.split("\\b")).stream()) 
                    .collect(groupingByConcurrent(w -> w, counting()));

答案 2 :(得分:1)

请注意

map.merge(word, 1, (c, inc) -> c + inc);

或者

map.compute(word, c -> c != null ? c + 1 : 1);

版本较短,可能比

更有效
if (table.containsKey(words)) {
   table.put(words, table.get(words) + 1);
} else {
   table.put(words, 1);
}

Integer count = table.get(word);
table.put(word, count == null ? 1 : (count+1));

此主题中的人建议。