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

Search for keywords in a HashMap with a user entered string

我有一个 Java 作业,我们要使用 ArrayList class 对 "database" 书籍和期刊进行编程,将它们存储为 objects 类型的 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);

这是我根据我的知识拼凑的代码,以及我在该站点的各种线程上找到的类似问题。

我接近这个了吗?有什么我想念的吗?

假设您有两本书。一个标题为 "Book One",另一个标题为 "Book Two"。如果我对你的问题的理解正确,那么你就是在用类似下面的内容填充标题映射。

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

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

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

现在,如果您搜索 "Book",您将得到所描述的行为。

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

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 class,但上面的代码只是一个简单的起点。

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