交换列表列表而不影响实际对象

时间:2017-04-11 08:06:15

标签: java list arraylist collections swap

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

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

}

我已将此数据用于具有Parent列表的对象。 父项的每个项目都有一个子项数组列表。

当用户选择任何父母的孩子时。

我将选定的父级交换到第0个位置,并将所选的孩子也交换到第0个位置。假设用户选择了第二个父母的第4个孩子。

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

}

但是我希望在交换后不间断地保留原始副本。

处理List的可变性我正在创建一个新的ArrayList,其参考值为实际列表,如下所示

 parentListCopy = new ArrayList<>(actualParentList);
交换后,

我的actualParentList索引不受影响。

但子数组列表的索引会根据对copyParent的子列表执行的交换而折叠。

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

}

1 个答案:

答案 0 :(得分:0)

当你这样做时

 parentListCopy = new ArrayList<>(actualParentList);

它不会将actualParentList的引用保存到parentListCopy中。相反,它会创建一个新的列表引用,并将actualParentList的元素复制到parentListCopy。

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