Java ArrayList正在替换项,而不是将其添加到末尾

Java ArrayList正在替换项,而不是将其添加到末尾,java,Java,我有一个方法,可以在链表中查找具有特定id的节点,并将项目添加到该节点的arraylist中 ArrayList <String> elems; public Place addElemToLst(String id, String elem) { // if no nodes create new node if (head == null) { Node node = new N

我有一个方法,可以在链表中查找具有特定id的节点,并将项目添加到该节点的arraylist中

ArrayList <String> elems;

public Place addElemToLst(String id, String elem) {
        
            // if no nodes create new node
            if (head == null) { 
                Node node = new Node(id);
                node.elems.add(item);
                head = unit;
            } else if (head != null) {
                Node curr = head;
                while (curr.next != null && !curr.next.id.equals(id)) {
                    curr = curr.next;
                }
                // if there is a id match
                if (curr.id.equals(id)) {
                    curr.elems.add(item);
                }
                // add new Node
                else { // the error is in this section
                    Node node = new Node(id);
                    node.elems.add(elem); 
                    curr.next = node;
                    
                }
        
        }

        return this;
    }
arraylistelems;
公共场所加法器列表(字符串id,字符串元素){
//如果没有节点,则创建新节点
如果(head==null){
节点=新节点(id);
节点元素添加(项);
水头=单位;
}else if(head!=null){
节点电流=头部;
while(curr.next!=null&!curr.next.id.equals(id)){
curr=curr.next;
}
//如果有一个id匹配
如果(当前id等于(id)){
货币要素添加(项目);
}
//添加新节点
否则{//错误在本节中
节点=新节点(id);
node.elems.add(elem);
curr.next=节点;
}
}
归还这个;
}
问题是,当我多次调用id为“item1”的addElemToLst()并不断向arraylist添加元素时,arraylist将只保留输入arraylist的最后一项。重要的是,arraylist的大小始终为1,因为以前的条目不断被替换。这是为什么?错误是什么?我已将错误隔离到代码中的注释中。
谢谢

您没有检查第一个元素/头的正确ID

 while (curr.next != null && !curr.next.id.equals(id))
您可以在下半场尝试以下内容:

else {
        Node curr = head;
        Node prev = null;
        while(curr != null){                
            if(curr.id == id){
                curr.elems.add(elem);
                return this;
            }
            prev = curr;
            curr = curr.next;
        }
            Node node = new Node(id);
            node.elems.add(elem);
            prev.next = node;

        }
}

您没有检查第一个元素/头的正确ID

 while (curr.next != null && !curr.next.id.equals(id))
您可以在下半场尝试以下内容:

else {
        Node curr = head;
        Node prev = null;
        while(curr != null){                
            if(curr.id == id){
                curr.elems.add(elem);
                return this;
            }
            prev = curr;
            curr = curr.next;
        }
            Node node = new Node(id);
            node.elems.add(elem);
            prev.next = node;

        }
}

查找具有匹配ID的节点的方法将返回几个不同的错误否定,这将反过来导致覆盖现有节点。问题在于,您使用滑动窗口检查节点并确定匹配,但滑动条件与确定是附加到现有节点还是创建新节点的条件不一致

以下是几个例子来说明:

\=null
x=节点
o=具有匹配ID的节点
[]=滑动窗口(左侧为'curr',右侧为'curr.next`)
x->o->_
[    ]
由于匹配的节点位于列表的末尾,因此应该附加
`埃莱姆说。但是,您的代码检查'curr.id'(而不是'curr.next.id'),
错误地推断未找到匹配节点,并覆盖“curr.next”。
o->x->_
[    ]
[    ]
在这里,匹配节点位于列表的顶部,但是您的代码
跳过它并在列表末尾错误地创建新节点。
o->x->x->_
[    ]
[    ]
[     ]
如上所述,在的末尾错误地插入了新节点
由于您跳过了列表开头的匹配节点,因此列表将被删除。
x->o->x->_
[    ]
由于您正在检查'curr.id'(而不是'curr.next.id'),因此您的代码
错误地得出需要创建新节点的结论,覆盖
现有(匹配)节点并截断列表的尾部。
链表很难推理,而将
条件结合起来则更难推理。以下是(IMO)更容易推理的固定实施:

公共场所加法器列表(字符串id,字符串元素){
//如果列表为空,请创建一个新节点
if(head==null){
节点=新节点(id);
node.elems.add(elem);
头部=节点;
归还这个;
}
节点电流=头部;
while(curr.next!=null){
//如果匹配节点出现在列表中,
//追加元素并返回
如果(当前id等于(id)){
当前要素添加(要素);
归还这个;
}
curr=curr.next;
}
//如果列表中的最后一个节点是匹配的,请使用它
如果(当前id等于(id)){
当前要素添加(要素);
//现在已经耗尽了所有节点,创建一个新节点
}否则{
节点=新节点(id);
node.elems.add(elem);
curr.next=节点;
}
归还这个;
}

查找具有匹配ID的节点的方法将返回一些不同的错误否定,这将反过来导致覆盖现有节点。问题在于,您使用滑动窗口检查节点并确定匹配,但滑动条件与确定是附加到现有节点还是创建新节点的条件不一致

以下是几个例子来说明:

\=null
x=节点
o=具有匹配ID的节点
[]=滑动窗口(左侧为'curr',右侧为'curr.next`)
x->o->_
[    ]
由于匹配的节点位于列表的末尾,因此应该附加
`埃莱姆说。但是,您的代码检查'curr.id'(而不是'curr.next.id'),
错误地推断未找到匹配节点,并覆盖“curr.next”。
o->x->_
[    ]
[    ]
在这里,匹配节点位于列表的顶部,但是您的代码
跳过它并在列表末尾错误地创建新节点。
o->x->x->_
[    ]
[    ]
[     ]
如上所述,在的末尾错误地插入了新节点
由于您跳过了列表开头的匹配节点,因此列表将被删除。
x->o->x->_
[    ]
由于您正在检查'curr.id'(而不是'curr.next.id'),因此您的代码
错误地得出需要创建新节点的结论,覆盖
现有(匹配)节点并截断列表的尾部。
链表很难推理,而将
条件结合起来则更难推理。以下是(IMO)更容易推理的固定实施:

公共场所加法器列表(字符串id,字符串元素){
//如果列表为空,