2016-03-02 37 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

,很好的發現 –