繁体   English   中英

如何仅从HashMap中打印前10个单词及其频率?

[英]How to print just the top 10 words and their frequency from a HashMap?

我的代码有问题。 我正在阅读包含一些文本的文件,然后计算单词及其频率。 然后,我尝试打印出文本中最常用的10个单词。

但是,使用我尝试过的方法(例如,将循环设置为在10次迭代后停止),我得到的单词以相同的方式仅被打印了10次。 否则,我可以按频率打印文件中的所有单词。我只需要使用最频繁使用的前10个单词即可。

ArrayList<Integer> values = new ArrayList<>();
    values.addAll(wordcount.values());
    Collections.sort(values, Collections.reverseOrder());
    int last_i = -1;
    for(Integer i: values) {
        if (last_i == i)
            continue;
        last_i = i;
        System.out.println("The top 10 words are: ");
       // for (int count = 0; count < 10; count++) {
            for (String s : wordcount.keySet())
                if (wordcount.get(s) == i)
                    System.out.println(s + " : " + i);
           }
       }
}

请在上方找到“问题”代码。 我正在使用

BufferedReader

读取文本文件,然后删除所有可能导致同一单词在我的HashMap中显示为两个不同条目的标点和内容。

任何帮助,不胜感激。 谢谢!

这是带有lambdas的Java 8示例:

        Map<String, Integer> wordcount = new HashMap<>();
        wordcount.put("two", 20);
        wordcount.put("five", 50);
        wordcount.put("three", 30);
        wordcount.put("four", 40);
        wordcount.put("one", 10);
        wordcount.put("six", 60);
        wordcount.put("eight", 80);
        wordcount.put("twelve", 1);
        wordcount.put("nine", 90);
        wordcount.put("ten", 100);
        wordcount.put("seven", 70);
        wordcount.put("eleven", 1);
        wordcount.put("15", 1);
        wordcount.put("13", 2);
        wordcount.put("16", 4);
        wordcount.put("14", 3);
        wordcount.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
                .limit(10)
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (e1, e2) -> e1,
                        LinkedHashMap::new
                )).forEach((s, integer) -> System.out.println(String.format("%s : %s", s, integer)));

应该打印类似:

ten : 100
nine : 90
eight : 80
seven : 70
six : 60
five : 50
four : 40
three : 30
two : 20
one : 10

首先,您需要计算在Map的帮助下每个单词在文本中重复的次数,之后,由于出现频率最高的单词而以相反的顺序对地图条目进行排序将出现在集合的开头,并打印出该集合的前十个元素。

public void printTopTenWordsByFrequencyFrom(List<String> text) {
    Map<String, Integer> map = new HashMap<>();
    for(String word : text) {
        Integer times = map.get(word);
        if(times == null) {
            map.put(word, 1);
        } else {
            map.put(word, times + 1);
        }
    }
    map.entrySet().stream()
                  .sorted((one, another) -> - one.getValue().compareTo(another.getValue())) //sort entries to reverse order  
                  .limit(10) 
                  .forEach(entry -> entry.getKey() + " : " + entry.getValue());
}

没有流和lambda的版本:

  public void printTopTenWordsByFrequencyFrom(List<String> text) {
        Map<String, Integer> map = new HashMap<>();
        for(String word : text) {
            Integer times = map.get(word);
            if(times == null) {
                map.put(word, 1);
            } else {
                map.put(word, times + 1);
            }
        }
        List<Map.Entry<String, Integer>> statistics = new ArrayList<>(map.entrySet());
        Collections.sort(statistics, new Comparator<Map.Entry<String, Integer> {

            int compare(Map.Entry<String, Integer> one, Map.Entry<String, Integer> another) {
                return - one.getValue().compareTo(another.getValue()); 
            }
        });
        List<Map.Entry<String, Integer>> topTen = statistics.sublist(0, 9);
        for(Map.Entry<String, Integer> word : topTen) {
            System.out.println(word.getKey() + " : " + word.getValue());
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM