2016-03-02 2 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 yukon: 1 ноль: 2 заброшенный
2 аккордеон 2 acequia 2 через
2 добавлено 2

Итак, когда частоты создаются, у них есть правильная частота, но почему-то они все изменились на 2. Что еще более странно, если я изменил второй оператор печати на f.toString(), даже первый оператор печати показывает только 2 для частот, как это:

растет: 2 реки: 2 riveredge: 2 riversound: 2 дороги: 2 Роадраннерс: 2 придорожной: 2 обжаренный: 2

Может кто-нибудь скажет мне, почему все частоты установлены на 2 или где проблема?

ответ

1

Удалить static из

private static int frequency 

Вы хотите индивидуальную переменную экземпляра для каждого слова, а не один класс переменной для всех слов.


Кроме того, я бы рекомендовал Hashmap<String, Integer> для частотомера вместо создания каких-либо объектов оболочки, потому что ...

  1. Там нет причин для преобразования списка в массив, а затем в набор и вернуться к списку
  2. Вам не нужно сортировать список, прежде чем удаление дубликатов
  3. Collections.frequency в цикл имеет O (N^2) во время выполнения
+0

, хорошее определение –