Java关键字搜索对象的最佳数据结构是什么

假设我有一个“期刊文章”类,其中包含年份,作者,标题,期刊名称,关键字等变量。

诸如authors和keywords之类的变量可能被声明为String [] authorsString []关键字

通过一个或多个“关键字”,或几个作者姓名中的一个或标题的一部分,在“期刊论文”的一组对象中搜索的最佳数据结构是什么?

谢谢!

================================================== ========================在大家的帮助下,通过Processing环境实现的测试代码如下所示。 建议非常感谢! 谢谢!

ArrayList papers = new ArrayList(); HashMap<String, ArrayList> hm = new HashMap<String, ArrayList>(); void setup(){ Paper paperA = new Paper(); paperA.title = "paperA"; paperA.keywords.append("cat"); paperA.keywords.append("dog"); paperA.keywords.append("egg"); //println(paperA.keywords); papers.add(paperA); Paper paperC = new Paper(); paperC.title = "paperC"; paperC.keywords.append("egg"); paperC.keywords.append("cat"); //println(paperC.keywords); papers.add(paperC); Paper paperB = new Paper(); paperB.title = "paperB"; paperB.keywords.append("dog"); paperB.keywords.append("egg"); //println(paperB.keywords); papers.add(paperB); for (Paper p : papers) { // get a list of keywords for the current paper StringList keywords = p.keywords; // go through each keyword of the current paper for (int i=0; i<keywords.size(); i++) { String keyword = keywords.get(i); if ( hm.containsKey(keyword) ) { // if the hashmap has this keyword // get the current paper list associated with this keyword // which is the "value" of this keyword ArrayList papers = hm.get(keyword); papers.add(p); // add the current paper to the paper list hm.put(keyword, papers); // put the keyword and its paper list back to hashmap } else { // if the hashmap doesn't have this keyword // create a new Arraylist to store the papers with this keyword ArrayList papers = new ArrayList(); papers.add(p); // add the current paper to this ArrayList hm.put(keyword, papers); // put this new keyword and its paper list to hashmap } } } ArrayList paperList = new ArrayList(); paperList = hm.get("egg"); for (Paper p : paperList) { println(p.title); } } void draw(){} class Paper { //===== variables ===== int ID; int year; String title; StringList authors = new StringList(); StringList keywords = new StringList(); String DOI; String typeOfRef; String nameOfSource; String abs; // abstract //===== constructor ===== //===== update ===== //===== display ===== } 

使用HashMap数据结构。

例如

 Map journals = new HashMap(); journals.put("keyword1", testJA); if (journals.containsKey("keyword1") { return journals.get("keyword1"); } 

您可以将关键字作为字符串类型的键放在此映射中,但是,它仅支持“完全匹配”类型的搜索,这意味着您必须在搜索中使用关键字(在Hashmap中存储为键)。

如果您正在寻找“喜欢”类型的搜索,我建议您将对象保存在支持“喜欢”查询的数据库中。

编辑:再想一想,我认为你可以做一些“喜欢”的查询(就像SQL中的like子句一样),但效率不会太好,因为你在迭代所有键无论何时进行查询,都在HashMap中。 如果您了解正则表达式,则可以通过修改以下示例代码(例如key.matches(pattern))来执行各种查询:

  List results = null; for (String key : journals.keySet()) { if (key.contains("keyword")) /* keyword has to be part of the key stored in the HashMap, but does not have to be an exact match any more */ results.add(journals.get(key)); } return results; 

对于简单的情况,您可以使用Multimap 。 Guava图书馆里有一个。

对于大量数据,Apache Lucene将更适合。

我会从关键字(同样为作者或标题等)创建一个地图到一组JournalArticles。

 Map> keyWordMap = new HashMap<>(); Map> authorMap = new HashMap<>(); 

当您为每个关键词创建一个新的JournalArticle时,您将该文章添加到适当的集合中。

 JournalArticle ja = new JournalArticle(); for(String keyWorld : ja.getKeyWords()) { if(keyWordMap.containsKey(keyWorld) == false) keyWordMap.put(keyWorld, new HashSet()); keyWordMap.get(keyWorld).add(ja); } 

要查看,你可以这样做:

 String keyWord = "...."; Set matchingSet = keyWordMap.get(keyWord);