文件中单词的频率

时间:2014-11-03 03:47:54

标签: java file

我想知道是否有人可以解释为什么我在getSordsInOrderOfFrequency方法中遇到List错误

 public List<String> getWordsInOrderOfFrequency(){ 
    List tmp = new ArrayList<String> (frequencies.keySet());
    Collections.sort (tmp, this);
    return tmp; 

这是我的解析方法和频率供参考:

 public Parser() {
    // do not change the constructor, this initializes an empty Map
    frequencies = new HashMap<String, Integer>();
}



public void parse (String filename) throws IOException{
    File file = new File(filename);
    Scanner scanner = new Scanner(file);
    Map<String, Integer> frequencies = new TreeMap<String, Integer>();

    while(scanner.hasNext()){
        String word = scanner.next().replaceAll("[^A-Za-z0-9]"," ").toLowerCase();
        if(!frequencies.containsKey(word)){
            frequencies.put(word, 1);
        }
        else{
            frequencies.put(word, frequencies.get(word)+1);
        }

    }

  }

2 个答案:

答案 0 :(得分:1)

忽略与比较相关的问题,您已在frequencies方法中覆盖parse。因此,该方法使用局部变量而不是实例1。因此,在getWordsInOrderOfFrequency之后调用parse将导致空列表。

答案 1 :(得分:0)

目前,您正在根据单词而不是频率对列表进行排序。

创建一个节点类WordFrequency来存储该单词及其频率,并使其实现Comparable<WordFrequency>

class WordFrequency implements Comparable<WordFrequency> {
    private final String word;
    private final int frequency;

    public Word(final String word, final int frequency) {
        this.word = word;
        this.frequency = frequency;
    }

    public String getWord() {
        return word;
    }

    public int getFrequency() {
        return frequency;
    }

    public int compare(final WordFrequency other) {
        if(other == null) {
            return -1;
        } else {
            return Integer.compare(frequency, other.frequency);
        }
    }
}

然后,遍历您的地图,创建一个WordFrequency对象列表并对列表进行排序。