我有一个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);
这是我根据我的知识拼凑在一起的代码,以及我在这个网站上能够找到的各种线程的类似问题。
我接近这个权利吗?我有什么遗失的吗?
答案 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中。搜索功能应该只查看您的地图,但它也会改变它。请注意,在每次搜索之后,您都会清除所有不匹配的条目。你的下一个搜索找不到那些,也许这就是原因。如果您在搜索后添加新条目,这将完全解释为什么只找到一个条目 - 所有其他条目在之前的搜索中被删除。