Java - Является ли обычной практикой использование хеш-таблицы (например, HashMap) для отображения объектов на себя? - PullRequest
4 голосов
/ 07 февраля 2012

Я делаю Java-приложение, которое будет хранить кучу случайных слов (которые могут быть добавлены или удалены из приложения в любое время).Я хочу быстрый поиск, чтобы увидеть, есть ли данное слово в словаре или нет.Какую структуру данных Java лучше всего использовать для этого?На данный момент я думал об использовании hashMap и использовании одного и того же слова в качестве значения и ключа для этого значения.Это обычная практика?Использование одной и той же строки для ключа и значения в паре (ключ, значение) кажется мне странным, поэтому я хотел убедиться, что не было лучшей идеи, которую я пропускал.

Я также былподумав об альтернативном использовании treeMap для сохранения сортировки слов, давая мне время поиска O (lgn), но hashMap должен дать ожидаемое время поиска O (1), насколько я понимаю, поэтому я решил, что это будет лучше.

В общем, я просто хочу убедиться, что идея hashMap с удвоением строк как ключа и значения в каждой паре (ключ, значение) будет хорошим решением.Спасибо.

Ответы [ 4 ]

8 голосов
/ 07 февраля 2012

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

Это сценарий использования учебника Set. Вы можете использовать HashSet. Наивная реализация для Set<T> использует соответствующий Map<T, Object>, чтобы просто пометить, существует запись или нет.

1 голос
/ 07 февраля 2012

Если вы храните его как набор слов в словаре, я бы посоветовал взглянуть на Попытки. Они требуют меньше памяти, чем Set, и имеют быстрое время поиска худшегодело O(string length).

0 голосов
/ 07 февраля 2012

Моя единственная проблема - память, если вы используете HashSet и у вас очень большая коллекция слов ... Тогда вам придется загрузить всю коллекцию в память ... Если это не проблема ..... (И ваша коллекция должна быть очень большой, чтобы это было проблемой) ... Тогда с HashSet все будет в порядке ... Если у вас действительно очень большая коллекция слов, то вы можете попробовать использовать дерево, изагружайте в память только те части, которые вас интересуют.

Также имейте в виду, что вставка выполняется быстро, но не так быстро, как в дереве, помните, что для этого нужно, чтобы Java вставлял каждый элементотсортирован.Опять же, ничего особенного, но если вы добавляете много слов за раз, вы можете рассмотреть возможность использования дерева ...

0 голосов
/ 07 февраля 2012

Любой класс, который является Set, должен помочь вашей цели.Однако, обратите внимание, что Set не допустит дублирования.В этом отношении, даже Map не допустит дублирования ключей.Я бы предложил использовать ArrayList (при условии, что синхронизация не требуется), если вам нужно добавить дубликаты записей и рассматривать их как отдельные.

...