Java 数组列表找不到对象

Java 数组列表找不到对象,java,Java,因此,我尝试创建一个功能,其中可以保存两个当前对象,以便下次可以加载它们,而不是再次创建它们。我对以下课程有问题: public class Investor implements Serializable { private String investorName; private double investorCapital; private ArrayList<Share> shareOwned; private

因此,我尝试创建一个功能,其中可以保存两个当前对象,以便下次可以加载它们,而不是再次创建它们。我对以下课程有问题:

public class Investor implements Serializable {

        private String investorName;
        private double investorCapital;
        private ArrayList<Share> shareOwned;
        private ArrayList<Integer> numberOwned;

        public Investor(String name, double capital) {
            investorName = name;
            investorCapital = capital;
            shareOwned = new ArrayList<Share>();
            numberOwned = new ArrayList<Integer>();
        }
当我第一次启动程序时,它会提示我创建新的投资者对象,它会成功地创建新的投资者对象并将其保存在适当的位置,等等。之后,我可以使用程序:买卖股票等,但一旦我关闭它,并再次打开,它就不会识别以前购买的股票。例如,当我关闭时,我有Gold-100,当我再次打开程序时,它将显示Gold-100,并尝试再购买10个,它将向shareOwned添加新的Gold对象,我将有Gold-100,Gold-10。所以,据我所知,它无法识别旧的黄金对象,并添加了新的一个(这是有意的,如果它从未存在)

我无法上传整个程序,因为它相当大,投资者类中有buyShare方法:

public void buyShare(double price, int amount, Share stock) {
        investorCapital -= price * amount;
        if(shareOwned.contains(stock)) {
            numberOwned.add(shareOwned.indexOf(stock), numberOwned.get(shareOwned.indexOf(stock)) + amount);
        }
        else {
            shareOwned.add(stock);
            numberOwned.add(amount);
        }
    }
共享类(无函数):


您可以看到我在哪里检查“contains”,它应该返回addnumberrowned,但它会创建一个新的,所以它无法找到以前保存的黄金。很抱歉解释得这么糟糕,如果方便的话,我可以发送一个程序。

如果我理解您的问题,您希望有“Gold-110”,而不是“Gold-100,Gold-10”,对吗

所以,我认为您必须在共享类上实现equals和hashCode方法。调用“shareOwned.contains(stock)”时,从不返回true,对吗

这就是为什么列表中总是有一个新的stock对象

添加到您的项目中,并将此代码放在您的共享类中:

@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

应该有用

如果我理解你的问题,你希望有“金-110”,而不是“金-100,金-10”,对吗

所以,我认为您必须在共享类上实现equals和hashCode方法。调用“shareOwned.contains(stock)”时,从不返回true,对吗

这就是为什么列表中总是有一个新的stock对象

添加到您的项目中,并将此代码放在您的共享类中:

@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

应该有用

非常感谢您!我解决了这个问题。正如前面提到的,我必须重写Share类中的equals()和hashCode()方法,现在一切工作(至少看起来)都很好。我尝试使用循环来检查名称,但是这个解决方案要简单得多

@Override

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Share share = (Share) o;

        if (!shareName.equals(share.shareName)) return false;

        return true;
    }

    @Override
        public int hashCode() {
            return 1;
        }

        public void setMarketValue() {
            shareValue = SHARE_PURE_VALUE / shareAvailable;
            shareValue = Math.round(shareValue * 10) / 10;
        }

非常感谢你!我解决了这个问题。正如前面提到的,我必须重写Share类中的equals()和hashCode()方法,现在一切工作(至少看起来)都很好。我尝试使用循环来检查名称,但是这个解决方案要简单得多

@Override

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Share share = (Share) o;

        if (!shareName.equals(share.shareName)) return false;

        return true;
    }

    @Override
        public int hashCode() {
            return 1;
        }

        public void setMarketValue() {
            shareValue = SHARE_PURE_VALUE / shareAvailable;
            shareValue = Math.round(shareValue * 10) / 10;
        }

不要全部发布,只做一个最小的复制器。它很可能会让你自己找到错误。不要全部发布,只需制作一个最小的复制器。它很可能会使您自己找到错误。是的,这是正确的!它将转到else,即当共享不存在时。我更改了上面的答案,为您的问题添加了可能的解决方案。您不必为
ArrayList
实现
hashCode()
。是的,这是正确的!它将转到else,即当共享不存在时。我更改了上面的答案,为您的问题添加了可能的解决方案。您不必为
ArrayList
实现
hashCode()
。您没有解决问题@丹苏扎解决了这个问题。没有必要只是重复他的回答。您不必为
ArrayList
实现
hashCode()
。是的,我感谢他,但我只是使用了shareName变量而不是EqualBuilder。您看过我们的答案了吗@EJPYou没有解决这个问题@丹苏扎解决了这个问题。没有必要只是重复他的回答。您不必为
ArrayList
实现
hashCode()
。是的,我感谢他,但我只是使用了shareName变量而不是EqualBuilder。您看过我们的答案了吗@EJP