通过Occurance对单词列表进行排序的最简单方法

Kle*_*ine 2 java sorting parsing arraylist

在Java中,按照它们出现在列表中的次数对大量单词列表(10,000-20,000)进行排序的最佳/最简单方法是什么?我尝试了一个基本的实现,但是我得到了内存运行时错误,所以我需要一种更有效的方法.你会建议什么?

ArrayList<String> occuringWords = new ArrayList<String>();
    ArrayList<Integer> numberOccur = new ArrayList<Integer>();
    String temp;
    int count;
    for(int i = 0; i < finalWords.size(); i++){
        temp = finalWords.get(i);
        count = 0;
        for(int j = 0; j < finalWords.size(); j++){
            if(temp.equals(finalWords.get(j))){
            count++;
            finalWords.remove(j);
            j--;
            }
        }
        if(numberOccur.size() == 0){
            numberOccur.add(count);
            occuringWords.add(temp);
        }else{
            for(int j = 0; j < numberOccur.size(); j++){
            if(count>numberOccur.get(j)){
                numberOccur.add(j, count);
                occuringWords.add(j, temp);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

finalWords是所有字符串的列表.我必须存储每个单词出现在单独的arraylist中的次数,因为我想不出更好的方法来保持它们配对而不将每个单词作为单独的对象.

Joh*_*ica 9

HashMap<String, Integer>根据出现次数构建映射字.第一次看到一个单词时将其添加到地图并将计数设置为1.此后,如果地图中已存在该单词,则会增加计数.

这将更快,因为您只需迭代一次单词列表.它是O(n)和O(n 2)之间的差异,对于大字典而言,这将是一个巨大的差异.

最后,您可以获取单词列表并按计数对其进行排序.您必须将它们从地图中取出并将它们添加到单独的数据结构中才能执行此操作.(提示:您可以使用TreeSet自定义Comparator,根据频率对单词进行比较.或者,不太优雅,将它们添加到a List然后对该列表进行排序,再次使用自定义Comparator.)