Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 在不影响实际对象的情况下交换列表的列表_Java_List_Arraylist_Collections_Swap - Fatal编程技术网

Java 在不影响实际对象的情况下交换列表的列表

Java 在不影响实际对象的情况下交换列表的列表,java,list,arraylist,collections,swap,Java,List,Arraylist,Collections,Swap,我有一个对象,它的JSON模式结构如下: { "ParentList": [ { "Parrent": "ListItem0", "ChildListItems": [ 1, 2, 3 ] }, { "Parrent": "ListItem1", "ChildListItems": [ 1,

我有一个对象,它的JSON模式结构如下:

{
"ParentList": [
    {
        "Parrent": "ListItem0",
        "ChildListItems": [
            1,
            2,
            3
        ]
    },
    {
        "Parrent": "ListItem1",
        "ChildListItems": [
            1,
            2,
            3,
            4,
            5
        ]
    }
]
}

我已将此数据消耗到一个对象中,该对象具有父对象的数组列表。 父项的每个项都有子项的数组列表

当用户选择任何父项的子项时

我将选定的父项交换到第0个位置,并将选定的子项也交换到第0个位置。假设用户选择了第二个父项的第四个子项

{
"ParentList": [
    {
        "Parrent": "ListItem1",
        "ChildListItems": [
            4,
            2,
            3,
            1,
            5
        ]
    },
    {
        "Parrent": "ListItem0",
        "ChildListItems": [
            1,
            2,
            3
        ]
    }
]
}

但我想在交换后不间断地保留原始副本

为了处理列表的易变性,我创建了一个新的ArrayList,其引用值为实际列表,如下所示

 parentListCopy = new ArrayList<>(actualParentList);
}当你这样做的时候

 parentListCopy = new ArrayList<>(actualParentList);
parentListCopy=newarraylist(actualParentList);
它不会将actualParentList的引用保存到parentListCopy中。相反,它创建一个新的列表引用,并将actualParentList的元素复制到parentListCopy


如果要保留引用ID,则需要交换对象的每个字段,而不是交换对象。例如,假设有一个类型为Parent的对象,它有两个字段a和b。您有父对象的ArrayList,并希望将索引0与索引3交换。您需要将parents.get(0.a与parents.get(3.a)和parents.get(0.b与parents.get(3.b)进行交换。

是否要在ActualPartnerList中进行交换?在您的示例中,子对象正在被交换,但父对象没有被交换。那里的理想行为是什么?两个都应该交换,还是都不交换?您没有对数组列表项进行深度复制。您需要逐个克隆arraylist的内容。请参见此处:可能的副本
 parentListCopy = new ArrayList<>(actualParentList);