如何逐个将项目添加到 ArrayList 中而不相互替换?



我想创建一个购物清单应用程序。我不确定如何逐个添加项目,以便列表扩展而不是替换现有项目。这是我目前的代码。我尝试使用 for 循环失败。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
List<ShoppingItem> list = new ArrayList<>();
String name = ShoppingListUI.jTextField1.getText();    
double price = Double.parseDouble(jTextField2.getText());
int quantity = Integer.parseInt(jTextField3.getText());
ShoppingItem item = new ShoppingItem(name, price, quantity);
list.add(item);
for (ShoppingItem temp : list) {
System.out.println("Item: " + temp.getName() + ", Price: " + temp.getPrice() + ", Quantity: " + temp.getQuantity());
}
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");    
}

您正在您的方法中创建一个新的列表:

List<ShoppingItem> list = new ArrayList<>();

因此,每次调用jButton1ActionPerformed时,都会创建一个新List,其中仅包含一个元素。

应将该list更改为包含此方法的类的实例变量。

public class YourClass {
List<ShoppingItem> list = new ArrayList<>();
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String name = ShoppingListUI.jTextField1.getText();    
double price = Double.parseDouble(jTextField2.getText());
int quantity = Integer.parseInt(jTextField3.getText());
ShoppingItem item = new ShoppingItem(name, price, quantity);
list.add(item);
for (ShoppingItem temp : list) {
System.out.println("Item: " + temp.getName() + ", Price: " + temp.getPrice() + ", Quantity: " + temp.getQuantity());
}
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");    
}
}

我不确定如何逐个添加项目,以便列表扩展而不是替换现有项目。

这是因为您要在每个操作上创建一个新列表。应将列表声明移至顶级。 因此,您的列表保持不变,并且会不断在其中添加项目。

List<ShoppingItem> list = new ArrayList<>();
......// other codes 
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
String name = ShoppingListUI.jTextField1.getText();    
double price = Double.parseDouble(jTextField2.getText());
int quantity = Integer.parseInt(jTextField3.getText());
ShoppingItem item = new ShoppingItem(name, price, quantity);
list.add(item);
for (ShoppingItem temp : list) {
System.out.println("Item: " + temp.getName() + ", Price: " + temp.getPrice() + ", Quantity: " + temp.getQuantity());
}
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");    

}


并进一步查看您的代码

String name = ShoppingListUI.jTextField1.getText();    
double price = Double.parseDouble(jTextField2.getText());
int quantity = Integer.parseInt(jTextField3.getText());

您正在以正确的方式解析用户输入的文本。您可能需要检查解析错误并要求用户重新输入。

执行操作时,您始终会创建一个新列表。在那之后,"旧"列表不再引用。 将新项添加到新列表中。所以这是你看到的唯一项目。您需要在操作操作已执行方法之外实例化列表。

private List<ShoppingItem> list = new ArrayList<>();
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){                                          
String name = ShoppingListUI.jTextField1.getText();    
double price = Double.parseDouble(jTextField2.getText());
int quantity = Integer.parseInt(jTextField3.getText());
ShoppingItem item = new ShoppingItem(name, price, quantity);
list.add(item);
for (ShoppingItem temp : list) {
System.out.println("Item: " + temp.getName() + ", Price: " + temp.getPrice() + ", Quantity: " + temp.getQuantity());
}
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");    
}

目前在创建中列出对方法的每次调用,您需要将其移动到函数之外。

你需要让它成为实例变量,请注意,如果你每次调用函数时都创建新的类实例 - 将类中的list定义为静态字段并使用它。

public static List<ShoppingItem> list = new ArrayList<>();

最新更新