В настоящее время я занимаюсь программированием на третий год и его фолио-трекером. :/Я упаковал интерфейсы 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;
}
Я только пришел сюда за помощью, потому что я ударил в кирпичную стену и мне действительно нужна помощь. Если бы кто-нибудь мог дать мне какие-либо предложения, я был бы вечно в вашем долге.
Спасибо, Крис
Вы не указали какой-либо код, который использует 'ArrayList', что затрудняет привязку этого ... –
Ах, извините, отредактируйте сообщение и добавьте несколько методов, которые используют arraylist. – ChrisMacDee
Когда вы добавляете объект в список, вы добавляете ссылку на этот объект, а не на копию объекта. Если вы позже измените объект, все ссылки на этот объект увидят это изменение. –