2012-02-13 3 views
1

В рамках текущего проекта класса нам было предложено использовать Карты для лучшего связывания объектов.Поиск Java HashMap

Короче говоря, в настоящее время мы имеем четыре ArrayLists, которые держат объекты на

// Array Lists used for sorting. 
private static ArrayList<Party> partyList = new ArrayList<Party>(); 
private static ArrayList<Creature> creatureList = new ArrayList<Creature>(); 
private static ArrayList<Treasure> treasureList = new ArrayList<Treasure>(); 
private static ArrayList<Artifact> artifactList = new ArrayList<Artifact>(); 

Каждый класс имеет свои собственные поля (то есть, партия имеет «индекс», «имя», Существо имеет «индекс», «имя» , «возраст», высота», и т.д ... но они все имеют уникальный индекс)

на этой неделе мы должны реализовать HashMaps, где ключ объекта, является его индекс.

так , в качестве примера:

creatureMap.put(creature.index, creature) 
... 

Наша программа также позволяет осуществлять поиск. Поэтому я понимаю, что теперь, когда мы ищем по индексу, мы просто просматриваем соответствующий хэш-файл для нужного нам индекса и работаем с объектом, который является его значением.

Однако наша программа также позволяет пользователю искать по имени, высоте, весу и т. Д. Итак, как эффективно использовать хэшмапы здесь, если это помогает только при поиске по индексу? Что произойдет, если я хочу искать существа по имени? Мне нужно было бы перебрать все значения в хэш-карте, посмотреть на поле «имя». Именно это я и делаю с арраистом.

Наш профессор сказал это, когда кто-то задал подобный вопрос:

Идея заключается в том, что в первом проекте, простой подход к вставки все элементы в списки массива и когда один необходимо связать существо к партии или предмет к существу, нужно было бы искать линейку ArrayList до тех пор, пока не будет найден индекс элемента. Это операция O (n), если ArrayList не сортируется, и операция O (log n) , если список сортируется, но сортировка, как правило, O (n * n) или O (n log n) в зависимости в используемой операции сортировки.

На этой неделе я прошу вас внедрить систему поиска O (1), основанную на , на структуру данных карты. Таким образом, мы должны использовать индекс элемента как его ключ для генерации ссылок. Это используется один раз при обработке входного файла .

Таким образом, я не уверен, что правильно понимаю концепцию карт/ключей-значений.

ответ

3

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

Я не слишком уверен, что на то, что ваш профессор имел в виду под этим:

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

(я думаю, что он относится к связывая объекты по индексу, как и в «связать существо к партии», - может быть, он не относится к использованию HashMaps для поиска)

На стороне записки, это хорошая практика для объявления переменных на основе интерфейсов, а не конкретных типов. В вашем примере, вы должны определить список ваших полей, как List вместо ArrayList:

private static List<Party> partyList = new ArrayList<Party>(); 
1

Запуск через ваши вопросы (и заявлений) в порядке ....

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

Это верно.

Однако наша программа также позволяет пользователю искать по имени, высоте, весу и т. Д. Итак, как эффективно использовать хэшмапы здесь, если это помогает только при поиске по индексу?

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

Что произойдет, если я хочу, чтобы искать существо по имени? Мне нужно было бы перебрать все значения в хэш-карте, посмотреть на поле «имя». Именно это я и делаю с арраистом.

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

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

Это говорит о том, что есть другая часть задания - что-то делать с чтением ввода из файла и связыванием сторон, существ и предметов вместе.

Я предполагаю, что входной файл для сторон относится к существам на index (а также для существ, ссылающихся на предметы).
Именно эта связь, которую профессор хочет, чтобы вы ускорили, используя эти хэшмапы.
Я не думаю, что он пытается заставить вас изменить способ и другие виды поиска работы

(Очевидно, что это предположение, так как я не знаю, что на самом деле говорит присвоение)

+0

Действительно ,входной файл содержит строки, из которых мы создаем наши объекты. например (p: 001: воины выходного дня), эта строка говорит нам о создании партийного объекта, его индекс - 001, а его имя - выходцы воинов. Точно так же существо будет таким, но у него также будет другой индекс, к которому он принадлежит. (C: 250: conan: 001) – sqram

+2

Вправо. Таким образом, со списком версии кода вам нужно перебирать список, чтобы найти партию № 001, что делает ваш код чтения файла относительно медленным (когда у вас есть много сторон, чтобы пройти через). Версия карты ускорит чтение файла, выполнив поиск по индексу [O (1)] вместо итеративного поиска [O (n)]. – Tim

+0

Спасибо. Хотел бы я принять два ответа = | – sqram

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