无法使用日期计算利息

时间:2013-09-25 17:29:28

标签: java arrays date arraylist gregorian-calendar

我需要一些逻辑帮助以及一些代码帮助。

我正在编写一个程序,假设它是一个简单的ATM程序。它将进行存款取款和余额检查。

我还必须让我的程序记录每次存款的日期,并在计算用户检查余额时的5%利息时使用该日期。我遇到问题的部分是我需要存储存款金额的部分以及与该存款相对应的日期。我应该使用GregorianCalender方法。我只是在黑暗中拍摄,但我想我会使用一个阵列。但我对如何实现它一无所知。因为我是阵列的新手。

一旦我得到约会,在查看余额时,我需要检查自存入该金额以来计算利息的数月。对不起它是一个非常复杂的问题,但我是一个新手,这是我写过的最复杂的事情。

 public void printDeposit(){
    Calendar c = new GregorianCalendar();
    BigDecimal depositamt;
    Date date = c.getTime();

    int menuselection;
    System.out.println("Press 1 to deposit, zero to return to the main menu.");
    Scanner sc = new Scanner (System.in);

    menuselection = sc.nextInt();
            if (menuselection==1){
                System.out.println("Please enter the amount: " + date);
                depositamt = sc.nextBigDecimal();
                Transaction tran = new Transaction(depositamt, date);

    }

public class Transaction {

BigDecimal amt;
Date date;


public Transaction(BigDecimal amt, Date date) {
    this.amt = amt;
    this.date = date;

}

1 个答案:

答案 0 :(得分:0)

你应该在这里使用ArrayList数组的instread,但更重要的是,你应该使用数据库,即使它只是一个内存临时数据库。此外,printDeposit方法名称错误;这可能对应于打印存款收据。您希望您的逻辑类似于:

Console console = System.getConsole();
if (console == null) {System.exit(42)}
while(true) (
    String option = console.readLine("What would you like to ask this ATM? %d to Quit, %d to deposit, %d to withdraw:", 0, 1, 2;
    switch (option) {
      case "1": acceptDeposit(); break;
      case "2": acceptWithdrawl(); break;
      case "0": quit(); break;
      default: break;
    }
}

现在,您需要编写acceptDepositacceptWithdrawl方法。在数据库术语中,您需要一个balance表和一个transaction表。用Java术语来说,你需要这样的类:

public class Transaction {
    enum Type {DEPOSIT, WITHDRAWL, INTEREST};
    private Long userId;
    private Type type;
    private BigDecimal amount;
    private Date date;  // Switch to Joda-Time or its Java 8 equivalent when you can.
    // getters, setters, etc.
    public getBalanceChange() {
        if (type != WITHDRAWL) {
            return amount;
        } else {
            return amount.negate();
        }
    }
}

你明白为什么要用户名吗?

您的应用程序将有一个事务列表,并且您无法保存将用户ID映射到余额的地图,您需要一个平衡方法:

public BigDecinmal balance(Long userId) {
    BigDecimal balance = new BigDecimal("0.00");
    for (Transaction t: transactionList) {
        if (userId.equals(t.getUserId())) {
            balance = balance.add(t.getBalanceChange());
        }
    }
}

使用数据库表,您将对数据库执行更新。如果这个应用程序不断运行,您可以安排作业来计算兴趣,可能使用Java Quartz库。对于学生应用程序,您可以通过以下方法进行模拟:

private void applyInterest(Date from, Date to){...}

事实上,这是反对使用GregorianCalendar并在每次交易时获得一个的论据;在实际使用中,每个会话将是一天的一部分。相反,请设置Date currentDateDate interestLastApplied变量,并定期提升currentDate