使用用户输入的字符串在HashMap中搜索关键字

时间:2015-11-11 01:09:46

标签: java arraylist hashmap keyword-search

我有一个Java任务,我们要编写一个"数据库"使用ArrayList类将书籍和期刊存储为Reference类型的对象。

这项任务的要求之一是我们在数据库中拆分书籍的标题,并将它们保存到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);

这是我根据我的知识拼凑在一起的代码,以及我在这个网站上能够找到的各种线程的类似问题。

我接近这个权利吗?我有什么遗失的吗?

2 个答案:

答案 0 :(得分:2)

我们说你有两本书。其中一个名为&#34; Book One&#34;另一个名为&#34; Book Two&#34;。如果我正确理解了您的问题,您将使用下面的内容填充标题地图。

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

如果我做对了,问题不在于您的搜索代码,而是标题对象本身的数据结构。如果我们通过上面写的伪代码运行上面的例子,那么最后的地图是什么样的?

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

现在,如果您搜索&#34; Book&#34;你会得到所描述的行为。

你是如何解决这个问题的?你需要的不仅仅是简单的地图。一个选项是列表地图,在您的情况下

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

另一个选项是GS Collections库中的Multimap类,但上面的代码是一个简单的起点。

答案 1 :(得分:1)

您的搜索功能也会永久损坏您的标题&#34; HashMap中。搜索功能应该只查看您的地图,但它也会改变它。请注意,在每次搜索之后,您都会清除所有不匹配的条目。你的下一个搜索找不到那些,也许这就是原因。如果您在搜索后添加新条目,这将完全解释为什么只找到一个条目 - 所有其他条目在之前的搜索中被删除。