java - 数组列表找不到对象

标签 java

所以我正在尝试创建一个可以保存两个当前对象的功能,以便下次可以加载它们而不是再次创建它们。我对以下类(class)有疑问:

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>();
        }

附言我删除功能只是为了显示结构。然后我执行以下代码:

File investorData = new File("inv1.ser");

 if(investorData.exists()) {
            try {
                FileInputStream loadData = new FileInputStream(investorData);
                ObjectInputStream ois = new ObjectInputStream(loadData);
                inv1 = (Investor) ois.readObject();
                loadData.close();
                ois.close();
            } catch (Exception exc) {
                JOptionPane.showMessageDialog(null, "An error occurred", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
        else {
            try {
                String name = JOptionPane.showInputDialog(null, "What is your name?", "Creating new investor", JOptionPane.QUESTION_MESSAGE);
                double capital = Double.parseDouble(JOptionPane.showInputDialog(null, "What is your investor capital?", "Creating new investor", JOptionPane.QUESTION_MESSAGE));
                inv1 = new Investor(name, capital);
            }
            catch(NullPointerException exc) {
                JOptionPane.showMessageDialog(null, "You must enter details in order to proceed", "File Not Found", JOptionPane.ERROR_MESSAGE);
            }
            JOptionPane.showMessageDialog(null, "New investor " + inv1.getInvestorName() + " with balance: " + inv1.getInvestorCapital() + " has been successfully created!", "Investor Created", JOptionPane.INFORMATION_MESSAGE);
            try {
                FileOutputStream saveFile = new FileOutputStream(investorData);
                ObjectOutputStream oos = new ObjectOutputStream(saveFile);
                oos.writeObject(inv1);
                saveFile.close();
                oos.close();
            }
            catch(Exception exc) {
                JOptionPane.showMessageDialog(null, "An error occurred", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }

当我第一次启动程序时,它会提示我创建新的 Investor 对象,它会成功创建并保存在适当的位置等。之后我可以使用程序:买卖股票等,但是一旦我关闭它并再次打开,它就无法识别之前购买的股票。因此,例如,如果当我关闭时我有 Gold - 100,那么当我再次打开程序时它会显示 Gold - 100 并会尝试再购买 10 个,它会添加新的 Gold 对象到 shareOwned 我将有 Gold - 100,Gold - 10.据我所知,它无法识别旧的 Gold 对象并添加了新的对象(如果它不存在,这是预期的)。

我无法上传整个程序,因为它很大,投资者类中有 b​​uyShare 方法:

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);
        }
    }

分享类(无功能):

public class Share implements Serializable {

    private String shareName;
    private double shareValue;
    private int shareAvailable;
    private final double SHARE_PURE_VALUE;

    public Share(String name, double value, int available) {
        shareName = name;
        SHARE_PURE_VALUE = value;
        shareValue = value / available;
        shareValue = Math.round(shareValue * 10) / 10;
        shareAvailable = available;
    }

你可以看到我在哪里检查“包含”,它应该返回只是添加 numberOwned,但它创建了一个新的,所以它找不到以前保存的以前的金币。不好意思解释得这么烂,如果方便的话我可以发个程序。

最佳答案

如果我理解你的问题,你希望得到“Gold - 110”,而不是“Gold - 100, Gold - 10”,对吗?

因此,我认为您必须在 Share 类上实现 equals 和 hashCode 方法。当调用“shareOwned.contains(stock)”时,永远不会返回 true,对吗?

这就是为什么您的列表中总是有一个新的库存对象。

添加commons-lang3到您的项目并将此代码放在您的 Share 类中:

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

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

应该可以。

关于java - 数组列表找不到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29243407/

相关文章:

java - 用于处理固定宽度文件的高效模式

java - 使用 gson 反序列化 Value<T> 等对象

java - Spring mvc 调度程序问题

c# - 将加密代码从 Java 移植到 C# 时存在一些等价问题

java - float 型最多可容纳38个数字,双型最多可容纳300个数字。这些神奇的数字从何而来?

java - 如何在核心java中添加SSL证书?

java - 从 sharedpreference 中删除所有数据

java - 从自定义标签返回值到jsp

java - 使用 Bouncy CaSTLe 和 PDFBox 在 Java 中验证 PDF 签名

java - 玩! Intellij IDEA 中的 2.0 控制台将无法工作