java - 怎么了

标签 java object arraylist

我创建了两个类。当我选择检索存款或取款历史记录时,我只能获取日期,显示的值只是最后存入的值。
我不明白为什么它只显示日期。

这是第一个类:

import javax.swing.*;
import java.text.*;
import java.util.*;

public class AtmTime{
private String date;
private double cash, funds;
private DecimalFormat dfmt = new DecimalFormat("$,###,##0.00");

public void addFunds(double moneyIn){
    funds = funds + moneyIn;
}
public void withdrawFunds(double moneyOut){
    while(moneyOut > funds){
        JOptionPane.showMessageDialog(null,"You have tried to withdraw " + dfmt.format(moneyOut), "Insufficient funds: " + dfmt.format(funds), JOptionPane.INFORMATION_MESSAGE);
        moneyOut = Double.parseDouble(JOptionPane.showInputDialog(null,"Try again ", "Withdraw", JOptionPane.INFORMATION_MESSAGE));
    }
    funds = funds - moneyOut;
}
public double getFunds(){
    return funds;
}
public double getCash(){
    return cash;
}
public String getDate(){
    DateFormat dfm = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date dates = new Date();
    return dfm.format(dates);
}
}

这是第二个:

import javax.swing.*;
import java.text.*;
import java.util.*;

public class AtmTimeApp{
public static void main(String []args){
    int control = 0;
    String date;
    double cash = 0;
    DecimalFormat dfmt = new DecimalFormat("$,###,##0.00");
    List<AtmTime> atmListIn = new ArrayList<AtmTime>();
    List<AtmTime> atmListOut = new ArrayList<AtmTime>();
    AtmTime atm = new AtmTime();

    while(control !=6){
        control = Integer.parseInt(JOptionPane.showInputDialog(null,"1- Funds \n 2- Add money \n 3- Withdraw \n4- Deposit history \n5- Withdraw history \n6- Exit", "Choose an option below", JOptionPane.INFORMATION_MESSAGE));
        if(control == 2){
            date = atm.getDate();
            double moneyIn = Double.parseDouble(JOptionPane.showInputDialog(null,"Amount ", "Add Money", JOptionPane.INFORMATION_MESSAGE));
            atm.setDate(date);
            atm.addFunds(moneyIn);
            atmListIn.add(atm);
            JOptionPane.showMessageDialog(null,"Your new funds " + dfmt.format(atm.getFunds()), "On " + atm.getDate(), JOptionPane.INFORMATION_MESSAGE);
        }
        else if(control == 1){
                JOptionPane.showMessageDialog(null,"" + dfmt.format(atm.getFunds()), "Total in your account", JOptionPane.INFORMATION_MESSAGE);
        }
            else if(control == 3){
                date = atm.getDate();
                double moneyOut = Double.parseDouble(JOptionPane.showInputDialog(null,"Amount ", "Withdraw Money", JOptionPane.INFORMATION_MESSAGE));
                atm.withdrawFunds(moneyOut);
                atmListOut.add(atm);
                JOptionPane.showMessageDialog(null,"New funds " + dfmt.format(atm.getFunds()), "Operation Successful completed", JOptionPane.INFORMATION_MESSAGE);
            }
                else if (control == 4){
                        for (int i=0;i<atmListIn.size();i++){
                            atm = atmListIn.get(i);
                            JOptionPane.showMessageDialog(null,"Deposit of " + dfmt.format(atm.getCash()), "When " + atm.getDate(), JOptionPane.INFORMATION_MESSAGE);
                        }
                    }
                    else if (control == 5){
                        for (int i=0; i<atmListOut.size();i++){
                            atm = atmListOut.get(i);
                            JOptionPane.showMessageDialog(null,"Withdraw of " + dfmt.format(atm.getCash()), "When " + atm.getDate(), JOptionPane.INFORMATION_MESSAGE);
                        }
                    }
                else if(control !=1 && control !=2 && control !=3 && control !=4 && control !=5 && control !=6)
                    JOptionPane.showMessageDialog(null,"Please choose a valid option", "Invalid number", JOptionPane.ERROR_MESSAGE);
    }
}
}

最佳答案

问题是您重复添加对同一对象的引用:

List<AtmTime> atmListIn = new ArrayList<AtmTime>();
List<AtmTime> atmListOut = new ArrayList<AtmTime>();
AtmTime atm = new AtmTime();

while(control !=6){
    control = Integer.parseInt(...);
    if(control == 2){
        date = atm.getDate();
        double moneyIn = Double.parseDouble(...);
        atm.setDate(date);
        atm.addFunds(moneyIn);
        atmListIn.add(atm);

每次您想要向列表添加记录时,您都应该创建一个对象,例如

List<AtmTime> atmListIn = new ArrayList<AtmTime>();
List<AtmTime> atmListOut = new ArrayList<AtmTime>();

while(control != 6) {
    control = Integer.parseInt(...);
    if(control == 2) {
        date = atm.getDate();
        double moneyIn = Double.parseDouble(...);
        AtmTime atm = new AtmTime(date, moneyIn);
        atmListIn.add(atm);

...其他地方也是如此。基本上,摆脱在循环外部声明的单个 atm 变量 - 您确实希望在每次迭代中使用单独的变量,这将迫使您要么获取现有的变量,要么获取现有的变量。要更新/显示的对象,或创建要添加的新对象。

关于java - 怎么了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683544/

相关文章:

Javascript:如何将包含对象的对象转换并映射到数组中?

java - Android - 自定义 ImageView,带有勾选标记图像为选定状态

java - ZipEntry UTF-8 字符集

java - 正则表达式匹配多行中的字符串模式

java内存不足然后退出

javascript - 从附加元素 jquery 访问对象属性或方法

delphi - 如何隐藏对象的 protected 过程?

java - 尝试从枚举类创建字符串的 ArrayList

java - Android 表单验证 - 如何防止空字段在按下按钮时导致应用程序崩溃?

java - 使用子集 - 成对差异(数组)