Как использовать хеш-таблицы для хранения слов и частоты использования? - PullRequest
2 голосов
/ 27 октября 2011

Я сейчас так растерялся. Я должен написать программу, которая использует хеш-таблицу. Хеш-таблица содержит слова вместе с частотой их использования. Класс «Word» содержит счетчик и строку. Если слово уже есть в таблице, его частота увеличивается. Я изучал, как это сделать, но я просто потерян. Мне нужно указать в правильном направлении. Любая помощь будет отличной.

Ответы [ 5 ]

3 голосов
/ 27 октября 2011

Hashtable был бы необычным выбором для любого нового Java-кода в наши дни.Я предполагаю, что это какое-то упражнение.

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

HashMap даст вам лучшую производительность, чем Hashtable в любомоднопоточный сценарий.

Но, как отмечает Эммануэль Бур , , Bag сделает все это для вас, не нуждаясь в классе Word вообще: просто добавьте объекты String вСумка, и сумка автоматически подсчитает для вас.

В любом случае, вас просят использовать Карту, и карта позволяет вам быстро находить вещи с помощью ключа.Ключом может быть любой объект, и очень часто используются строки: они являются неизменяемыми и имеют хорошие реализации hashCode и equals, что делает их идеальными ключами.

В javadoc для Map говорится окак вы используете карты.Hashtable является одной из реализаций этого интерфейса, хотя он не особенно хорош.

Вам нужен хороший ключ, чтобы быстро найти существующие объекты Word и увеличить счетчик.Хотя вы можете превратить сам объект Word в ключ, вам нужно будет поработать: лучше использовать строку, содержащуюся в Word, в качестве ключа.

Вы обнаружите, есть ли уже Слово на карте.ища объект значения, в качестве ключа которого используется строка.

3 голосов
/ 27 октября 2011
Hashtable<String, Word> words = new Hashtable<String, Word>();

public void addWord(String s) {
    if (words.containsKey(s) {
        words.get(s).plusOne();
    } else {
        words.put(s, new Word(s));
    }
}

Это сделает это.

1 голос
/ 27 октября 2011

Учитывая, что класс Word имеет счетчик и строку, я бы использовал HashMap<String, Word>. Если ваши входные данные представляют собой массив String s, вы можете сделать что-то вроде этого, используя:

public Map<String, Word> getWordCount(String[] input) {
    Map<String, Word> output = new HashMap<String, Word>();

    for (String s : input) {
        Word w = output.get(s);
        if (w == null) {
            w = new Word(s, 0);
        }
        w.incrementValue(); // Or w = new Word(s, w.getCount() + 1) if you have no such function
        output.put(s, w);
    }

    return output;

}

1 голос
/ 27 октября 2011

Этот кусок кода должен решить вашу проблему

  Hashtable <String, Word> myWords = new Hashtable<String, Word>();

  Word w = new Word("test");
  Word w = new Word("anotherTest");

  String inputWord = "test";

  if (myWords.containsKey(inputWord)){
      myWords.get(inputWord).setCounter(myWords.get(inputWord).getCounter+1);
  }
1 голос
/ 27 октября 2011

Вам лучше использовать Bag, он хранит счет каждого элемента:

http://commons.apache.org/collections/api-release/org/apache/commons/collections/Bag.html

...