Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用用户输入的字符串在HashMap中搜索关键字_Java_Arraylist_Hashmap_Keyword Search - Fatal编程技术网

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

Java 使用用户输入的字符串在HashMap中搜索关键字,java,arraylist,hashmap,keyword-search,Java,Arraylist,Hashmap,Keyword Search,我有一个Java任务,我们将使用ArrayList类编程一个图书和期刊的“数据库”,将它们存储为类型引用的对象 本作业的一个要求是,我们在数据库中拆分书籍的标题,并将其保存到HashMap中,以便以后进行关键字搜索 我的hashmap声明如下: private HashMap titles=新HashMap(10) 通过测试,我知道我向HashMap添加标题和引用的方法是有效的。不起作用的是我的搜索功能 private void searchBooks(String callNumber, St

我有一个Java任务,我们将使用ArrayList类编程一个图书和期刊的“数据库”,将它们存储为类型引用的对象

本作业的一个要求是,我们在数据库中拆分书籍的标题,并将其保存到HashMap中,以便以后进行关键字搜索

我的hashmap声明如下:
private HashMap titles=新HashMap(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);
private void searchbook(String callNumber、String[]关键字、int startYear、int endYear){
SetcommonKeys=newHashSet();
对于(int i=0;i
这是我根据自己的知识拼凑而成的代码,我在这个网站上发现了许多类似的问题


我接近正确的方向了吗?我缺少什么吗?

假设你有两本书。一本名为“第一本书”,另一本名为“第二本书”。如果我正确理解了你的问题,你正在用下面的内容填充标题地图

for each title
  split on " " character
    titles.put(title word, reference to the book)
如果我没有弄错,问题不在于你的搜索代码,而在于titles对象本身的数据结构。如果我们通过我上面写的伪代码运行上面的示例,那么最后的地图是什么样子的

Book -> Book Two
One -> Book One
Two -> Book Two
现在,如果您搜索“Book”,您将得到描述的行为

如何解决这个问题?你需要的不仅仅是一张简单的地图。在你的例子中,一个选项是列表地图

Map<String, List<Reference>>
你会做:

if (titles.containsKey(title word)) {
  titles.get(title word).add(reference to the book);
} else {
  titles.put(new List<Reference>() { reference to the book };
}
if(titles.containsKey(title-word)){
titles.get(标题词).add(对书的引用);
}否则{
titles.put(新列表(){对书的引用};
}

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

您的搜索功能也会永久性地破坏您的“标题”hashMap。搜索函数应该只查看地图,但它也会改变地图。请注意,每次搜索后,您是如何清除所有不匹配的条目的。下一次搜索将找不到这些条目,可能这就是原因。如果您在搜索后添加新条目,这将完美地解释为什么只找到一个条目-所有其他条目在上一次搜索中,删除了所有的书籍。

我不确定您的意思…忘记了上面提到的内容,无法编辑,但我当前拥有的代码有效,但只找到其中一本书,而且总是最新添加到HashMap中的。是否尝试删除找到的项目?因为Retainal()从HashMapI中删除该项目的所有匹配项。我不尝试删除它们。只是尝试将匹配项打印到屏幕上。甚至不知道这是Retainal()的问题。这似乎是我的问题。它会找到第一个实例,因为我使用Retainal()删除其他的,然后它无法找到匹配项。非常感谢Mike,我能够使用您的建议完成我的实现。干杯。
if (titles.containsKey(title word)) {
  titles.get(title word).add(reference to the book);
} else {
  titles.put(new List<Reference>() { reference to the book };
}