我正在创建一个倒排索引字典,它从文件中获取大约一百万条推文,将这些推文中的单词存储为字典(HashMap)中的键以及指向包含以下内容的发布列表(LinkedList)的指针文档 ID(推文用户名、日期等)作为 key 的值。
我的函数将单词存储为 HashMap 的键,没有任何问题,并且应该存储一个指向该单词每次出现的发布列表的对象指针作为键的值。但由于某种原因,当我尝试更新列表时它不起作用。一旦读完整个文件,HashMap 就会包含以 null 对象作为值的键。
这里的代码:
String line = scanner.nextLine();
String[] lineArr = line.split(" ");
DocID id = new DocID(lineArr[0], lineArr[1],lineArr[2]);
for(int i=3; i<lineArr.length; i++){
ListPointer list = new ListPointer();
if(dict.containsKey(lineArr[i].toLowerCase())) list = dict.get(lineArr[i]);
list.postings.add(id);
dict.put(lineArr[i].toLowerCase(), list);
}
}
应该存储一个带有列表属性的对象作为值,有效地充当指向列表的指针。如果表中存在相似的键,则获取该值,并应更新该值的列表属性并再次将其设置为该键的值。
我知道使用 LinkedList 作为 HashMap 的值而不是使用包含固有列表的对象会更好,但是我们被告知应该单独存储帖子列表并且不应该是字典类的属性,并且字典应该只包含指向其相关发布列表的指针。
到目前为止,这些是对象及其成员:
public static HashMap<String, ListPointer> dict;
public static class DocID{
public String userID;
public String date;
public String time;
public DocID(String dte, String tme, String id){
this.userID = id;
this.date = dte;
this.time = tme;
}
}
public static class ListPointer{
public static LinkedList<DocID> postings;
public ListPointer(){
postings = new LinkedList<DocID>();
}
}
我可以理解这是否是一个覆盖错误,但是不是,在完全读取文件后,HashMap 中每个键的值都是空,我不知道为什么会这样?
最佳答案
您的postings
成员不应该是静态的。您有一个跨所有 ListPointer
共享的实例实例,然后用空 LinkedList<DocID>
覆盖它每次ListPointer
构造函数被调用。
改变
public static LinkedList<DocID> postings;
至
public LinkedList<DocID> postings;
编辑:
您在从 map 检索时遇到另一个问题:
改变
if(dict.containsKey(lineArr[i].toLowerCase())) list = dict.get(lineArr[i]);
至
if(dict.containsKey(lineArr[i].toLowerCase())) list = dict.get(lineArr[i].toLowerCase());
如果您传递小写字母 String
至containsKey
,您必须传递相同的小写字母 String
至get
。否则get
将返回null
如果原始 key 不是小写。
关于java - LinkedList 对象 add() 函数不更新值 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40388513/