Java 有人能告诉我为什么A也改变了吗?
返回一个列表,该列表由a的元素后跟B的元素组成。不能修改a的项目。请使用“新建”。Java 有人能告诉我为什么A也改变了吗?,java,Java,返回一个列表,该列表由a的元素后跟B的元素组成。不能修改a的项目。请使用“新建”。IntList如下所示 public class IntList { public int first; public IntList rest; public IntList(int first, IntList rest) { this.first = first; this.rest = rest; } } public static In
IntList
如下所示
public class IntList {
public int first;
public IntList rest;
public IntList(int first, IntList rest) {
this.first = first;
this.rest = rest;
}
}
public static IntList catenate(IntList A, IntList B) {
//TODO: fill in method
IntList C = new IntList(A.first, A.rest);
IntList L = C;
while(L.rest != null) {
L = L.rest;
}
L.rest = B;
return C;
}
我不知道为什么最后A也变成了C。
下面是测试
public void testCatenate() {
IntList A = IntList.list(1, 2, 3);
IntList B = IntList.list(4, 5, 6);
IntList exp = IntList.list(1, 2, 3, 4, 5, 6);
assertEquals(exp, IntList.catenate(A, B));
assertEquals(IntList.list(1, 2, 3), A);
}
结果是
java.lang.AssertionError:
Expected :(1, 2, 3)
Actual :(1, 2, 3, 4, 5, 6)
在构造函数中,行
this.rest = rest;
使新列表中的rest
引用与传入的列表完全相同的列表。这意味着在catenate
的第一行之后,C.rest
和A.rest
是对完全相同列表的引用
然后,涉及L
的循环和随后的L.rest=B
将B
连接到C.rest
的末尾。但由于这是与A.rest
相同的列表,因此B
似乎已连接到A
和C
要解决这个问题,请去掉
this.rest=rest将其替换为实际复制构造函数中的rest
行中的条目的代码
this.rest = rest;
使新列表中的rest
引用与传入的列表完全相同的列表。这意味着在catenate
的第一行之后,C.rest
和A.rest
是对完全相同列表的引用
然后,涉及L
的循环和随后的L.rest=B
将B
连接到C.rest
的末尾。但由于这是与A.rest
相同的列表,因此B
似乎已连接到A
和C
要解决这个问题,请去掉this.rest=rest将其替换为实际复制rest
中的条目的代码。如果不希望修改IntList,请先将字段设置为first,然后将rest设置为final,以便在设置后不会对其进行更改
catenate方法需要创建一个副本,因此它不会修改原始列表
要执行此操作,请在执行过程中循环列表,但在每个步骤中保存值(在另一个IntList中或在另一个结构(如ArrayList)中。然后,在获得最后一个值后,创建一个新的IntList,其中first作为a中的最后一个值,其余作为B
new IntList(L.first, B);
现在,以相反的顺序循环从保存的项目,将它们添加到此新列表中。如果不想修改IntList,请先将字段设置为第一个字段,然后将其余字段设置为最后一个字段,以便在设置后不能对其进行更改
catenate方法需要创建一个副本,因此它不会修改原始列表
要执行此操作,请在执行过程中循环列表,但在每个步骤中保存值(在另一个IntList中或在另一个结构(如ArrayList)中。然后,在获得最后一个值后,创建一个新的IntList,其中first作为a中的最后一个值,其余作为B
new IntList(L.first, B);
现在,以相反的顺序循环从A保存的项目,将它们添加到此新列表中。什么是IntList
?和IntList L=C;
不是副本。很抱歉,已经更改了。什么是IntList
?和IntList L=C;
不是副本。很抱歉,已经更改了。构造函数很好问题是catenate
方法修改列表A,而不是复制。IntList
中的字段也应该是最终字段。构造函数不好。这是试图实现int的链表。两个链表共享其大部分节点,但不共享头节点是没有意义的。这会产生大量的ense共享除头部以外的所有节点。例如,这样可以避免在您只想更改头部时复制整个列表。这种概念称为结构共享,非常常见。基于此定义,几乎可以确定OP想要什么。构造函数很好,问题是catenate
方法修改了e列表A,而不是制作副本。IntList
中的字段也应该是最终字段。构造函数不好。这是试图实现int的链表。两个链表共享其大部分节点,但不共享head节点是没有意义的。共享除head之外的所有节点是有意义的。这样例如,当您只想更改列表的标题时,您可以避免复制整个列表。这一概念称为结构共享,非常常见。根据这一定义,几乎可以肯定OP希望这样做。