2015-11-11 2 views
2

У меня есть назначение Java, где мы должны запрограммировать «базу данных» книг и журналов, используя класс ArrayList, чтобы хранить их как объекты типа Reference.Поиск ключевых слов в HashMap с введенной пользователем строкой

Одним из требований этого задания является то, что мы разделяем названия книг в базе данных и сохраняем их в HashMap, чтобы впоследствии разрешить поиск по ключевым словам.

Мой HashMap объявлен как это: private HashMap <String, Reference> titles = new HashMap <String,Reference> (10);

Я знаю, через тестирование, что, как я добавить заголовки и ссылки на HashMap работы. Не работает функция поиска.

private void searchBooks(String callNumber, String[] keywords, int startYear, int endYear) { 
    Set<String>commonKeys = new HashSet<String>(); 
    for(int i = 0; i < keywords.length; i ++) 
    { 
     commonKeys.add(keywords[i]); 
    } 
    titles.keySet().retainAll(commonKeys); 
    System.out.println(titles); 

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

Я подхожу к этому правилу? Есть что-то, что мне не хватает?

+0

Я не уверен, что вы имеете в виду ... – user275615

+0

Забыл упомянуть выше, и я не могу редактировать, но код, который у меня есть сейчас, но только находит ОДИН из книг, и его всегда самое последнее один добавлен в HashMap. – user275615

+0

Вы пытаетесь удалить найденные предметы? потому что keepAll() удаляет все вхождения этого элемента из HashMap –

ответ

2

Предположим, у вас есть две книги. Один из них называется «Книга один», а другой - «Книга вторая». Если я правильно понял ваш вопрос, вы заполняете карту названий чем-то вроде ниже.

for each title 
    split on " " character 
    titles.put(title word, reference to the book) 

Если бы я получил это право, проблема не с кодом поиска, а структура данных названий самого объекта. Если мы запустим пример выше через псевдокод, который я написал выше, как выглядит карта в конце?

Book -> Book Two 
One -> Book One 
Two -> Book Two 

Теперь, если вы ищете «Книгу», вы получите описанное поведение.

Как вы это решаете? Вам нужно нечто большее, чем простая карта. Одним из вариантов является отображение списков, в вашем случае

Map<String, List<Reference>> 

Вы бы заполнить этот почти так же, как вы уже, но вместо

titles.put(title word, reference to the book) 

Вы бы:

if (titles.containsKey(title word)) { 
    titles.get(title word).add(reference to the book); 
} else { 
    titles.put(new List<Reference>() { reference to the book }; 
} 

Другим вариантом будет класс Multimap из библиотеки GS Collections, но приведенный выше код является простой отправной точкой.

+0

Спасибо большое Майку, я смог завершить свою реализацию, используя ваш совет. Приветствия. – user275615

1

Функция поиска также постоянно повреждает хэш-карту «заголовки». Функция поиска должна смотреть только на вашу карту, но она также меняет ее. Обратите внимание, что после каждого поиска вы уничтожили все записи, которые не совпадали. Ваш следующий поиск не найдет их, может быть, это и есть причина. Если вы добавляете новую запись после поиска, это прекрасно объясняет, почему только одна запись найдена - все остальные были уничтожены в предыдущем поиске.

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