创建列表深层副本

时间:2018-10-31 02:02:30

标签: java list

我正在尝试创建列表的深层副本,但是即使尝试一切复制原始列表后,我仍然收到新列表为空的错误消息。

我不确定我的问题是否出在代码的深层复制部分,或者在将元素添加到原始列表时是否出错。到目前为止,我有:

public class OwnedPiggyBank 
{
    List<Coin> bank;
    private Owner owner;


    public OwnedPiggyBank(Owner owner) 
    {
        this.owner = owner;
        bank = new ArrayList<>();
    }

    public void add(List<Coin> coins) 
    {
        bank.addAll(coins);
    }

    public List<Coin> deepCopy() 
    {
        List<Coin> coins = new ArrayList<>();

        for (Coin c : bank)
        {
            coins.add(new Coin(c));
        }

        return coins;
    }

...与之相关的测试用例是:

public void test() 
{
    OwnedPiggyBank b = new OwnedPiggyBank("Lola");
    List<Coin> coins = new ArrayList<Coin>(Arrays.asList(Coin.PENNY, Coin.LOONIE, Coin.TOONIE));
    b.add(coins);
    OwnedPiggyBank c = new OwnedPiggyBank(b);
    assertEquals(coins, c.deepCopy());
}

2 个答案:

答案 0 :(得分:2)

在构造函数public OwnedPiggyBank(Owner owner)中,您拥有

bank = new ArrayList<>();

因此,deepCopy bank中的当然是empty

assertEquals(coins, b.deepCopy());

更有意义

如果您想保留test的情况,那么您需要做类似的事情

public OwnedPiggyBank(OwnedPiggyBank owner) 
{
    this.owner = owner;
    bank = owner.deepCopy();
}

答案 1 :(得分:1)

OwnedPiggyBank似乎没有构造函数,该构造函数可以接受书面测试用例的第4条语句中所述的另一个OwnedPiggyBank。添加如下所示的构造函数可以解决该问题。

OwnedPiggyBank(OwnedPiggyBank ob){
   this.owner = ob.owner;
   this.bank = ob.deepCopy();
}