2014-11-03 4 views
-3

мне интересно, если кто-то может объяснить, почему я получаю сообщение об ошибке со списком в методе getSordsInOrderOfFrequencyчастота слов в файле

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); 
     } 

    } 

    } 
+3

Можете ли вы объяснить, как вам нужна помощь или что вы в настоящее время не понимаете? – drum

+0

, поскольку это не проблема - StackOverflow - это сайт вопросов и ответов, а не сайт справки. –

+0

Как указывает @LeleDumbo ниже, вы создаете локальную переменную в методе синтаксического анализа, которая скрывает переменную класса с тем же именем - это означает, что вы заполняете локальную переменную, а не переменную класса. – Jason

ответ

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 и сортировку списка.

1

Игнорирование вопросов, связанных со сравнением, вы устранили frequencies в методе parse. Таким образом, метод использует локальную переменную вместо экземпляра one. Поэтому при вызове getWordsInOrderOfFrequency после parse будет указан пустой список.