0

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

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

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

谢谢!

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

ArrayList<Paper> papers = new ArrayList<Paper>();

HashMap<String, ArrayList<Paper>> hm = new HashMap<String, ArrayList<Paper>>();

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<Paper> 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<Paper> papers = new ArrayList<Paper>();        
        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<Paper> paperList = new ArrayList<Paper>();
  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 =====
}
4

3 回答 3

4

使用HashMap<String, JournalArticle>数据结构。

例如

Map<String, JournalArticle> journals = new HashMap<String, JournalArticle>();
journals.put("keyword1", testJA);

if (journals.containsKey("keyword1")
{
    return journals.get("keyword1");
}

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

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

编辑:再想一想,我认为您可以执行某种“like”查询(就像 SQL 中的 like 子句一样),但效率不会太好,因为您正在遍历所有键每当您进行查询时在 HashMap 中。如果您知道正则表达式,您可以通过修改以下示例代码(例如 key.matches(pattern))来执行各种查询:

    List<JournalArticle> 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;
于 2014-06-25T17:07:11.310 回答
0

对于简单的情况,您可以使用Multimap<String, Article>. Guava 库中有一个。

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

于 2014-06-25T17:15:11.640 回答
0

我会创建一个从关键字(同样是作者或标题等)到一组 JournalArticles 的映射。

Map<String, Set<JournalArticle>> keyWordMap = new HashMap<>();
Map<String, Set<JournalArticle>> authorMap = new HashMap<>();

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

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

要进行查找,您可以执行以下操作:

String keyWord = "....";
Set<JournalArticle> matchingSet = keyWordMap.get(keyWord);
于 2014-06-25T17:28:01.600 回答