找到字典中最常见的三个单词

Gök*_*ğan 0 java algorithm heap dictionary data-structures

问题是在字典中找到三个最常见的单词.我已经提出了下面的代码,但由于某些原因它不起作用(我的意思是当我尝试在eclipse中运行它时,它直接导致我调试页面,虽然我没有在编译器屏幕上得到任何错误),我调试后找不到原因.你能帮我找到问题吗?

java.util.PriorityQueue.add
(未知来源)中的线程"main"java.lang.NullPointerException中的异常,
位于
generalquestions.MostCommonWords.mostCommonStringFinder(MostCommonWords.java:41)的java.util.PriorityQueue.add (未知来源).MostCommonWords.main
(MostCommonWords.java:61)

  public static Queue<Integer> mostCommonStringFinder (String document, int k){

    if (document == null){
        throw new IllegalArgumentException();
    }
    if (document.isEmpty()){
        throw new IllegalArgumentException("Document is empty");
    }   

    String [] wordHolder = document.split(" ");     

    HashMap<String, Integer> map = new HashMap<String, Integer>();


    for (String s : wordHolder){

        if (!map.containsKey(s)){
            map.put(s, 1);

        }
        else{
            int value = map.get(s);
            value++;
            map.put(s, value);
        }           
    }

    Queue<Integer> minHeap = new PriorityQueue<>();

    for ( int i = 0 ; i < k ; i++){

        minHeap.add(map.get(i));            
    }       

    for(int j = k ; j < map.size() ; j++){

        if(map.get(j) > minHeap.peek()){
            minHeap.poll();
            minHeap.add(map.get(j));
        }
    }

    return minHeap;

}
Run Code Online (Sandbox Code Playgroud)

And*_*eas 5

map是一个HashMap<String, Integer>,所以键是字符串,即文本中的单词.

map.get(i)将永远返回null,因为Integer地图中没有键.


既然你回来了,Queue<Integer>我会假设期望是最重要的k词数,所以从以下方面替换所有内容Queue<Integer> minHeap:

List<Integer> counts = new ArrayList<>(map.values());
Collections.sort(counts, Collections.reverseOrder());
return counts.subList(0, k);
Run Code Online (Sandbox Code Playgroud)

并将返回类型更改为List<Integer>.

测试

String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " +
              "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, " +
              "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo " +
              "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse " +
              "cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat " +
              "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
System.out.println(mostCommonStringFinder(text, 3));
Run Code Online (Sandbox Code Playgroud)

产量

[3, 2, 2]
Run Code Online (Sandbox Code Playgroud)