2013-07-16 25 views
0

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

Каждый раз, когда я добавляю слово в структуру, он сначала проверяет, существует ли слово, если да, время появления плюс один, если нет, добавьте это слово в структуру. Таким образом, я могу найти элемент очень быстро, используя эту структуру. Думаю, я должен использовать хэш-таблицу или хэш-карту, не так ли?

И я также хочу получить отсортированный список, поэтому структура может быть ранжирована за короткое время.

Забыл, что я использую Java для его написания.

Спасибо, ребята! :)

ответ

2

A HashMap похоже, что он подойдет вам хорошо. Если вам нужен поточно-безопасный вариант, перейдите по ссылке ConcurrentHashMap. не

. Например:

Map<String, Integer> wordOccurenceMap = new HashMap<>(); 

"TreeMap обеспечивает гарантированное O (Log N) время поиска (и вставки и т.д.), в то время как HashMap обеспечивает O (1) время поиска, если хэш-код рассеивает ключи соответствующим образом, если вы нужны записи для сортировки, я бы придерживался HashMap. " - часть ответа Джона Скита в TreeMap or HashMap.

1

TreeMap - лучшее решение, если вы хотите как функцию сортировки, так и подсчет слов. Пользовательское Trie может сделать более эффективным, но это не требуется, если вы не изменяете слова.

1

Определение Hashmap со словом в качестве ключа и счетчика в качестве значения

Map<String,Integer> wordsCountMap = new HashMap<String,Integer>(); 

Затем добавить логику так:

  • Когда вы получите слово, проверять его на карте, используя containsKey метод
  • Если найдено ключ (слово), введите значение get и увеличьте значение
  • Если ключ (слово) Не найдено, добавьте значение, используя THW слово как ключ и put со счетом 1 в качестве значения
0

Таким образом, вы могли бы использовать HashMap, но не забывайте о multythreading. Можно ли получить доступ к этой структуре данных через несколько потоков? Кроме того, вы можете использовать три карты в случае, если данные имеют некоторую гирархию (например, в случае рейкинга и сортировки по времени). Кроме того, вы можете просмотреть все коллекции google goava, возможно, они будут более сумасшедшими для вас.

0

Любая реализация карты осуществит. Если Localized Changes предпочитает HashMap otherWise ConcurrentHashMap для многопоточности.

Не забудьте использовать любую библиотеку для стебля. stemming library in java например рабочий и рабочий логически одно и то же слово.

Запомнить Целое неизменно смотрите пример ниже Примера:

Map<String, Integer> occurrence = new ConcurrentHashMap<String, Integer>(); 

synchronized void addWord(String word) { // may need to synchronize this method 
    String stemmedWord = stem(word); 
    Integer count = occurrence.get(stemmedWord) 
    if(count == null) { 
     count = new Integer(0); 
    } 
    count ++; 
    occurrence.put(stemmedWord, count); 
    **// the above is necessary as Integer is immutable** 

} 
Смежные вопросы