2016-03-02 62 views
2

我有一些代码可以计算给定的单词ArrayList中的单词频率。我有一个频率类,它基本上存储了单词及其各自的频率。这里是我的代码:单词频率计数器,列表不能正常工作

public static List<Frequency> computeWordFrequencies(List<String> words) { 
     List<String> wordsList = words; 
     String[] wordsArray = wordsList.toArray(new String[0]); 
     Arrays.sort(wordsArray); 
     Set<String> noDuplicates = new LinkedHashSet<>(Arrays.asList(wordsArray)); 
     List<Frequency> frequencies = new ArrayList<>(); 
     for (String word : noDuplicates) { 
      int wordFrequency = Collections.frequency(words, word); 
      Frequency newFrequency = new Frequency(word, wordFrequency); 
      System.out.println(newFrequency.toString()); 
      frequencies.add(newFrequency); 
     } 
     for (Frequency f : frequencies) { 
      System.out.println(f.getText()+"    "+f.getFrequency()); 
     } 
     return frequencies; 
    } 

仅供参考,频率类:

public class Frequency { 

    private final String word; 
    private static int frequency; 

    public Frequency(String word) { 
     this.word = word; 
     frequency = 0; 
    } 

    public Frequency(String word, int newfrequency) { 
     this.word = word; 
     this.frequency = newfrequency; 
    } 

    public String getText() { 
     return word; 
    } 

    public int getFrequency() { 
     return frequency; 
    } 

    public static void setFrequency(int newFrequency) { 
     frequency = newFrequency; 
    } 

    public void incrementFrequency() { 
     frequency++; 
    } 

    @Override 
    public String toString() { 
     return word + ":" + frequency; 
    } 

} 

我插入打印语句在我的代码,这是一些输出:

包装:1码:3纱:2年:2尚未:1育空地:1零:2放弃
2手风琴2 acequia 2跨
2加2 2

所以当创建频率时,他们有正确的频率,但不知何故他们后来都变为2.更奇怪的是,如果我将第二个打印语句更改为f.toString(),甚至是第一个print语句只显示2这样的频率:

上升:2河流:2 riveredge:2 riversound:2路:2个走鹃:2 路边:2烤:2

灿有人告诉我为什么所有的频率都设置为2,或者问题出在哪里?从

private static int frequency 

回答

1

删除static您想为每个字,不是所有的词一类变量中的单个实例变量。


此外,我会建议Hashmap<String, Integer>的频率计数器,而不是创建任何包装的对象,因为......

  1. 没有理由的列表转换为一个数组,然后到一个集,并返回到列表
  2. 您不必删除重复
  3. Collections.frequency一个循环为O内(N^2)运行时
之前排序列表
+0

,很好的发现 –