Java - добавление объекта в массив списков, а затем добавление другого в массив списков приводит к перезаписи первого элемента - PullRequest
2 голосов
/ 11 декабря 2010

В настоящее время я занимаюсь программированием на третьем курсе и слежением за фолио.: / Я создал интерфейсы Stock_API и Portfolio_API (и их реализации) и класс GUI, который при создании экземпляра принимает два параметра следующим образом:

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

Я использую этот конструктор как способ получения реализаций этих интерфейсовв GUI, не подвергая реализацию GUI (что является одной из основных целей этого проекта).У объекта портфолио есть имя (строка) и ArrayList.Фондовый объект имеет символ тикера (строка), название акции (строка), стоимость акции (float), количество акций (int) и стоимость владения (float).

В GUIу меня есть список массивов portCollection, который содержит объекты типа portfolio_API, и поэтому система может отслеживать несколько портфелей.Также, как упомянуто в приведенном выше блоке кода, есть объекты tempStock и tempPort.

Извините, что дал вам столько подробностей о программе, но я подумал, что лучше всего, чтобы я мог разобраться в контексте.Во всяком случае, проблема под рукой.У меня есть метод, который использует графический интерфейс для получения символа тикера, названия акции и количества акций и добавляет акцию в текущий открытый портфель (у каждого портфеля есть своя вкладка).Метод выглядит следующим образом:

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 делает это.Не уверен, почему, хотя, как если бы я добавил переменную в массив, он стал частью этого массива и не нуждался в связи с переменной tempStock?

Методы, которые используются с упомянутыми массивами:

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 ]

3 голосов
/ 11 декабря 2010

Да, я думаю, что вы правы, когда говорите, что это потому, что вы повторно используете переменную 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);
0 голосов
/ 12 декабря 2010

Спасибо, ребята, за ваш вклад. Сертифицированный профессор @oracle помог с проблемами с акциями после добавления перегруженного метода для addStock, но у него возникли проблемы с портфелем.

Я создал метод makePortfolio в Portfolio_API, чтобы создать новый портфель и вернуть его. Таким образом, он избежит любых неприятных перезаписей, добавлю его на склад тоже только сейчас.

Еще раз спасибо, ребята. Доброй ночи! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...