2010-12-11 2 views
2

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

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

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

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

Эти два находятся в классе портфолио:

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

Я только пришел сюда за помощью, потому что я ударил в кирпичную стену и мне действительно нужна помощь. Если бы кто-нибудь мог дать мне какие-либо предложения, я был бы вечно в вашем долге.

Спасибо, Крис

+4

Вы не указали какой-либо код, который использует 'ArrayList', что затрудняет привязку этого ... –

+0

Ах, извините, отредактируйте сообщение и добавьте несколько методов, которые используют arraylist. – ChrisMacDee

+3

Когда вы добавляете объект в список, вы добавляете ссылку на этот объект, а не на копию объекта. Если вы позже измените объект, все ссылки на этот объект увидят это изменение. –

ответ

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); 
+0

Я бы хотел, но путем повторной инициализации мне пришлось бы делать tempStock = new Stock(); но это приведет к реализации GUI:/Мне жаль, что существует способ сделать tempStock = new Stock_API(), но, конечно, быть интерфейсом, вы не можете его инициализировать. – ChrisMacDee

+1

Вы можете перегрузить 'addStock()' класса Portfolio' ', чтобы получить данные о запасах' addStock (тикер Ticker, int numOfShares, String name) 'и построить его там – 2010-12-11 20:32:43

0

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

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

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

Смежные вопросы