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

71
9

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

спросил(а) 2011-10-27T02:21:00+04:00 8 лет, 11 месяцев назад
1
Решение
81

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

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

ответил(а) 2011-10-27T02:27:00+04:00 8 лет, 11 месяцев назад
81

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


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


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


Но как указывает Emmanuel Bourg , Bag будет делать все из этого для вас, не требуя класса Word вообще: просто добавьте объекты String в сумку, и сумка автоматически будет подсчитывать вас.

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


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


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


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

ответил(а) 2011-10-27T02:36:00+04:00 8 лет, 11 месяцев назад
58

Учитывая, что класс 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;


}

ответил(а) 2011-10-27T02:28:00+04:00 8 лет, 11 месяцев назад
58

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


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

ответил(а) 2011-10-27T02:27:00+04:00 8 лет, 11 месяцев назад
57

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


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

ответил(а) 2011-10-27T02:26:00+04:00 8 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема