Java ArrayList正在替换项,而不是将其添加到末尾
我有一个方法,可以在链表中查找具有特定id的节点,并将项目添加到该节点的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
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,字符串元素){
//如果列表为空,