Java - 将一个对象添加到一个arraylist,然后在arraylist中添加另一个对象会导致第一个元素被覆盖

时间:2010-12-11 19:49:23

标签: java arraylist overwrite

我目前正在做我的第三年编程项目及其作品集跟踪器。 :/我已经创建了Stock_API和Portfolio_API接口(以及它们的实现)和一个GUI类,当实例化时,它会采用两个参数:

public GUI(Portfolio_API p, Stock s){
      tempPort = p;
      tempStock = s;
}

我使用这个构造函数作为将这些接口的实现引入GUI的方法,而不将实现暴露给GUI(这是该项目的主要目标之一)。组合对象具有名称(字符串)和ArrayList。股票对象具有股票代码(字符串),股票名称(字符串),股票价值(浮动),股票数量(int)和持有(浮动)值。

在GUI中我有一个portCollection数组列表,其中包含portfolio_API类型的对象,这样系统就可以跟踪多个组合。另外,如上面的代码块中所提到的,还有一个tempStock和tempPort对象。

很抱歉给你这么详细的程序,但我认为最好,所以我可以得到上下文。无论如何,手头的问题。我有一个方法,它使用GUI来获取股票代码,股票名称和股票数量,并将股票添加到当前投资组合中(每个投资组合都有自己的选项卡)。该方法如下所示:

public void addStock() {
    int num_shares = 0;
    float dailyChange = 0.0f;
    float stockValue = 0.0f;
    boolean succeed = true;

    // GUI gets information of stock from user
    String ticker = JOptionPane.showInputDialog(frame,
            "Enter the ticker symbol:");
    String stockName = JOptionPane.showInputDialog(frame,
            "Enter the Stock name:");
    try {
        num_shares = Integer.parseInt(JOptionPane.showInputDialog(frame,
                "Enter the number of shares:"));
    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(frame,
                "Number of shares was not an integer. Try again");
        succeed = false;
    }

    // If parsing was successful...
    if (succeed) {
        tempStock.setTicker(ticker);
        tempStock.setNumberOfShares(num_shares);
        tempStock.setStockName(stockName);

        // Fetches newest value using the current ticker symbol
        boolean succeedUpdate = tempStock.updateShareValue();

        if (succeedUpdate) {
            tempStock.calculateValueOfHolding();

            // Adds to the current portfolio...
            String tabName = tabbedPane.getTitleAt(tabbedPane
                    .getSelectedIndex());
            System.out.println(tabName);
            findPortfolio(tabName).addStock(tempStock);
            findPortfolio(tabName).sort();

            // ...Then adds it to the table
            JPanel j = (JPanel) tabbedPane.getSelectedComponent()
                    .getComponentAt(0, 0);
            JViewport v = ((JScrollPane)   j.getComponent(0)).getViewport();
            JTable table = (JTable) v.getComponent(0);

            float currentTotal = findPortfolio(tabName).getTotal();

            // Updates the total label
            ((JLabel) j.getComponent(1)).setText("Total: " + currentTotal);

            Object[] newStock = { tempStock.getTicker(),
                    tempStock.getStockName(),
                    tempStock.getNumberOfShares(),
                    tempStock.getShareValue(),
                    tempStock.getValueOfHolding() };
            ((DefaultTableModel) table.getModel()).addRow(newStock);
        }
    }
}

当我添加多个股票时,新股票将取代旧股票,并有效地覆盖它。我认为它正在重复使用tempStock。不确定为什么虽然如果我将变量添加到arraylist它肯定会成为该arraylist的一部分并且不需要与tempStock变量关联?

与上述arraylists一起使用的方法:

private Portfolio_API findPortfolio(String name) {
        Portfolio_API p = null;
        for (int i = 0; i < portCollection.size(); i++) {
            if (portCollection.get(i).getName() == name) {
                p = portCollection.get(i);
            }
        }

这两个在Portfolio类中:

@Override
public boolean addStock(Stock_API s) {
    if (!doesExist(s)) {
        portfolio.add(s);
        return true;
    } else {
        return false;
    }

}

@Override
public boolean doesExist(Stock_API s) {
    boolean found = false;
    for (int i = 0; i < portfolio.size(); i++) {
        if (portfolio.get(i).getTicker() == s.getTicker()) {
            found = true;
        }
    }
    return found;
}

我只是来这里寻求帮助,因为我撞到了一堵砖墙,我真的需要帮助。如果有人能给我任何建议,我将永远欠你的债。

谢谢, 克里斯

2 个答案:

答案 0 :(得分:3)

是的,当你说你认为这是因为你正在重复使用tempStock变量时,我认为你是对的。此变量仍引用原始对象,因此在setTicker()上调用tempStock等也会更改ArrayList引用的对象,因为它是同一个对象。尝试重新初始化tempStock并查看它是否有所作为:

// If parsing was successful...
    if (succeed) {
        tempStock = new Stock(); // or however you instantiate this object
        tempStock.setTicker(ticker);
        tempStock.setNumberOfShares(num_shares);
        tempStock.setStockName(stockName);

答案 1 :(得分:0)

感谢大家的所有投入。 @oracle认证教授在为addStock添加重载方法后帮助解决了库存问题,但结果却出现了困扰投资组合的问题。

我所做的是在Portfolio_API中创建一个makePortfolio方法来创建一个新的投资组合并将其返回。这样它就可以避免任何令人讨厌的覆盖,现在也将其添加到库存中。

再次感谢你们。晚安! :)