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

时间:2016-11-02 19:46:54

标签: java pointers dictionary linked-list hashmap

我正在创建一个倒置索引字典,它从文件中获取大约一百万条推文,将这些推文中的单词存储为字典中的键(HashMap)和指向包含该文件的发布列表(LinkedList)的指针文档ID(推文用户名,日期等)作为密钥的值。

我的函数将单词作为HashMap的键存储没有问题,并且应该将每个单词出现的对象指针存储到发布列表中作为键的值。但由于某些原因,当我尝试更新列表时,它无法正常工作。一旦读完整个文件,HashMap就会包含以空对象作为其值的键。

这里的代码:

            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);
            }
        }

应该存储一个带有list属性作为值的Object,有效地充当指向列表的指针。如果表中存在类似的键,则获取该值,并更新该值的列表属性,并将其再次设置为该键的值。

我知道使用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中每个键的值为null,我不知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

您的postings会员不应该是静态的。您在所有ListPointer个实例中共享了一个实例,并且每次调用LinkedList<DocID>构造函数时都会用空ListPointer覆盖它。

更改

public static LinkedList<DocID> postings;

public LinkedList<DocID> postings;

编辑:

从地图检索中还有另一个问题:

更改

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

答案 1 :(得分:0)

我看到两个问题:

问题1。

range(5)

类ListPointer不需要是静态的,成员“postss”也不是静态的。

第2期

public static class ListPointer{
public static LinkedList<DocID> postings;
...

我认为主要问题在于这一行。你试图匹配小写的一切,但是当你从dict获得密钥时你没有使用.toLowerCase()