Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人能告诉我为什么A也改变了吗?_Java - Fatal编程技术网

Java 有人能告诉我为什么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

返回一个列表,该列表由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 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=restrest

行中的条目的代码

this.rest = rest;
使新列表中的
rest
引用与传入的列表完全相同的列表。这意味着在
catenate
的第一行之后,
C.rest
A.rest
是对完全相同列表的引用

然后,涉及
L
的循环和随后的
L.rest=B
B
连接到
C.rest
的末尾。但由于这是与
A.rest
相同的列表,因此
B
似乎已连接到
A
C


要解决这个问题,请去掉
this.rest=restrest

中的条目的代码。如果不希望修改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希望这样做。