我有一个公共类名为" InvertedIndex "它有两个私人数据成员:
private HashMap<String, ArrayList<Integer>> invertedList;
private ArrayList<String> documents;
我为它们生成了getter和setter函数。我有一个名为&#34; buildFromTextFile &#34;它填充了两个数据成员,我还有另一个名为&#34; processQuery &#34;的函数。我在课堂上写了一个测试单元&#34; InvertedIndexTest &#34;对于processQuery,如下所示:
@Test
public void testProcessQuery() throws IOException{
InvertedIndex invertedIndex = new InvertedIndex();
String query = "ryerson award";
ArrayList<String> expectedResult = new ArrayList<String>();
expectedResult.add("ryerson award ??..23847");
invertedIndex.buildFromTextFile("input.tsv");
ArrayList<String> result = processQuery(query, 5);
Assert.assertEquals(expectedResult, result);
}
在此功能中,在调试模式下,当功能&#34; buildFromTextFile &#34;被调用,代码将转到类&#34; InvertedIndex &#34;并填充数据成员,因此在此函数的末尾,数据成员中包含正确的数据。当我看到 invertedIndex.getInvertedList()。ToString()时,再次运行回到此单元测试功能,我可以看到数据仍然是正确的。然后调用函数 processQuery ,当运行进入&#34; InvertedIndex &#34; class,在此函数内, invertedList()。ToString()为空。似乎所有数据都丢失了,但我不知道在哪里。我很感激你的帮助。
这是processQuery方法:
public ArrayList<String> processQuery(String query, int k){
ArrayList<String> result = new ArrayList<String>();
ArrayList<Integer> resultIds;
String[] queryWords = query.split("\\W+");
ArrayList<Integer> list1;
resultIds = invertedList.get(queryWords[0]);
for (int i = 1; i < queryWords.length; i++) {
list1 = invertedList.get(queryWords[i]);
resultIds = intersect(list1, resultIds);
}
Collections.sort(resultIds);
for (Integer item : resultIds) {
result.add(documents.get(item));
}
return result;
}
运行此行时resultIds为空:
resultIds = invertedList.get(queryWords[0]);
我在 queryProcess 函数的第一行设置了一个断点,两个数据成员都是空的。
答案 0 :(得分:2)
我看到你的倒置列表存在更多问题。 : - )
这实际上是由您之前遇到的完全相同的问题造成的: Hashmap get function returns null
行
ArrayList<String> result = processQuery(query, 5);
应该阅读
ArrayList<String> result = invertedIndex.processQuery(query, 5);
建议将所有测试移至完全独立的文件中。这样可以省去这些现场参考的麻烦。