java - LinkedList 对象 add() 函数不更新值 - java

标签 java pointers dictionary linked-list hashmap

我正在创建一个倒排索引字典,它从文件中获取大约一百万条推文,将这些推文中的单词存储为字典(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());

如果您传递小写字母 StringcontainsKey ,您必须传递相同的小写字母 Stringget 。否则get将返回null如果原始 key 不是小写。

关于java - LinkedList 对象 add() 函数不更新值 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40388513/

相关文章:

java - 在 Java Swing 中创建一个不可见的按钮

c++ - 在递归中修改调用指针时出现问题

c - 为什么结构体的内存副本没有按预期将字节复制到字节流?

python - 为什么python dict键的顺序不一致?

arrays - 将范围(有条件)中的唯一值组合到另一个范围中

java - 纯 Java 中的依赖注入(inject)

java - Servlet 上下文 URL

java - 如何使字符串比较不区分大小写?

C - 我的内存释放功能有什么问题?

python - 使用 lambda 函数和标量的字典理解