Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—将一个对象添加到arraylist,然后将另一个对象添加到arraylist会导致覆盖第一个元素_Java_Arraylist_Overwrite - Fatal编程技术网

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

Java—将一个对象添加到arraylist,然后将另一个对象添加到arraylist会导致覆盖第一个元素,java,arraylist,overwrite,Java,Arraylist,Overwrite,我目前正在做我第三年的编程项目,它是一个对开本跟踪工具。:/我已经包装了Stock_API和Portfolio_API接口(以及它们的实现)和一个GUI类,该类在实例化时采用两个参数: public GUI(Portfolio_API p, Stock s){ tempPort = p; tempStock = s; } 我使用这个构造器作为一种将这些接口的实现引入GUI的方法,而不将实现公开给GUI(这是本项目的主要目标之一)。公文包对象具有名称(字符串)和Array

我目前正在做我第三年的编程项目,它是一个对开本跟踪工具。:/我已经包装了Stock_API和Portfolio_API接口(以及它们的实现)和一个GUI类,该类在实例化时采用两个参数:

public GUI(Portfolio_API p, Stock s){
      tempPort = p;
      tempStock = s;
}
我使用这个构造器作为一种将这些接口的实现引入GUI的方法,而不将实现公开给GUI(这是本项目的主要目标之一)。公文包对象具有名称(字符串)和ArrayList。股票对象具有股票代码(字符串)、股票名称(字符串)、股票价值(浮动)、股票数量(整数)和持有价值(浮动)

在GUI中,我有一个portCollection数组列表,其中保存类型为portfolio_API的对象,因此系统可以跟踪多个portfolio。正如上面代码块中提到的,还有一个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变量关联

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

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);
            }
        }
private Portfolio\u API findPortfolio(字符串名称){
投资组合_API p=null;
对于(int i=0;i
这两个属于投资组合类:

@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;
}
@覆盖
公共布尔addStock(Stock_API s){
如果(!性别歧视者){
投资组合。添加(s);
返回true;
}否则{
返回false;
}
}
@凌驾
公共布尔doesExist(股票){
布尔值=false;
对于(int i=0;i
我来这里只是想寻求帮助,因为我遇到了困难,我真的需要帮助。如果有人能给我任何建议,我将永远欠你的债

谢谢,
Chris

是的,我认为你说得对,你认为这是因为你在重用
tempStock
变量。这个变量仍然引用原始对象,因此调用
setTicker()
tempStock
上的
etc也会更改
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);

谢谢大家的意见。@oracle认证教授在为addStock添加了一个重载方法后,帮助解决了股票问题,但同样的问题困扰着投资组合

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


再次感谢各位。晚安!:)

您还没有显示任何使用
ArrayList
的代码,这使得很难确定这一点……啊,对不起,我们将编辑帖子并添加一些使用ArrayList的方法。当您“添加”时如果将对象添加到列表中,则添加对该对象的引用,而不是该对象的副本。如果以后更改该对象,则对该对象的所有引用都将看到该更改。谢谢,我原以为发生了这种情况,但不确定。谢谢您的确认。我会的,但通过重新初始化,我必须执行tempStock=new Stock();但这将向GUI公开实现:/I我希望有一种方法可以实现tempStock=new Stock_API(),但作为一个接口,您当然不能初始化它。您可以重载
Portfolio
类的
addStock()
以获取股票数据
addStock(Ticker Ticker,int numOfShares,String name)
并在其中构建它