2015-05-01 5 views
1

В моей программе пользователи вводят значения, а те, которые хранятся в arrayList. Объекты ArryList записываются в файл. Я использовал поток file-i/o, object-i/o для записи и чтения в файле. Теперь я хочу выполнить сложение и вычитание среди объектов (int or double). То есть вывод денег с одного счета должен быть добавлен с другой учетной записью, и их стоимость должна быть вычтена и добавлена ​​с суммой конкретного счета. И, наконец, я хочу, чтобы это значение было обновлено, чтобы оно могло распечатывать и показывать текущий статус. Как я мог это сделать?Как выполнить арифметическую операцию между объектами, записанными в файле?

Это главный класс:

public class BankApp_Assignment { 

    //static int numOfAcc = 0; 
    public static void main(String[] args) { 
     System.out.println("WELCOME TO OUR BANK!\n\n"); 

     List<BankAccount> bankAccounts = new ArrayList<BankAccount>(); 
     List<BankAccount> bankAccounts2 = new ArrayList<BankAccount>(); 
     ReaderWriter rw=new ReaderWriter(); 


     while (true) { 
      System.out.println("Choose your option:\n" 
        + "1. Create new account\n" 
        + "2. Deposit/withdraw\n" 
        + "3. View One account\n" 
        + "4. Deleting an account\n" 
        + "5. View all the accounts\n" 
        + "6. Return to menu\n"); 

      System.out.println("*************\n" 
        + "************"); 

      option1 = sc.nextInt(); 
      sc.nextLine(); 
      //switch-case starts 
      switch (option1) { 
       case 1: 
        //create account 
        BankAccount bankAcc = new BankAccount(); 
        System.out.println("Enter Full Name:"); 
        bankAcc.setName(sc.nextLine()); 
        System.out.println("Choose an Account Number:"); 
        bankAcc.setAccNum(sc.nextInt()); 
        System.out.println("Choose the initial amount:"); 
        bankAcc.setInitiateAmount(sc.nextDouble()); 
        //adding those into the arrayList 
        bankAccounts.add(bankAcc); 
        rw.writeToFile(bankAccounts); 

        System.out.println("-------------\n" 
          + "-------------"); 
        break; 
       case 2: 
        bankAccounts2=(List<BankAccount>)rw.readFromFile(); 
        //First displaying the current accouns info 
        System.out.println("Name \tAccount No \tInitial Amount"); 
        for (BankAccount bankAccount : bankAccounts2) { 

         System.out.println(bankAccount); 

        } 

        System.out.println("\t\t.........\n" 
          + "\t\t........."); 

        System.out.println("To transfer money within the bank accounts enter 1\n" 
          + "To deposit/withdraw money in the same account enter 2"); 
        option2 = sc.nextInt(); 
        sc.nextLine(); 

        //inner switch-case starts 
        switch (option2) { 
         case 1: 
          /* 
          BankAccount is the class for setter and getter 
          bankAccounts2 is the arrayList for reading objects from file 
          */ 
          bankAccounts2 = (List<BankAccount>) rw.readFromFile(); 
          BankAccount fromAcc = null; 
          BankAccount toAcc = null; 
          System.out.println("Enter the account number you want to withdraw from:"); 

          withdraw_accNum = sc.nextInt(); 

          System.out.println("Enter the amount you want to withdraw:"); 

          withdraw_amount = sc.nextDouble(); 
          System.out.println("Enter the account number you want to deposit to:"); 

          deposit_accNum = sc.nextInt();//the deposit amount is alwyas the same as withdraw_amount 

          //find the matching acc number:withdraw_accNum 
          for (BankAccount listItemsFirst : bankAccounts2) { 
           //if the withdraw acc num matches with the given one 
           if (listItemsFirst.getAccNum() == withdraw_accNum) { 
            //store it 
            fromAcc = listItemsFirst; 
            break; 
           } 
          } 
          //find the matching acc number: deposit_accNum 
          for (BankAccount listItemsSec : bankAccounts2) { 
           //if the withdraw acc num matches with the given one 
           if (listItemsSec.getAccNum() == deposit_accNum) { 
            //store it 
            toAcc = listItemsSec; 
            break; 
           } 
          } 
          //if the withdraw amount is bigger than the current balance 
          if (withdraw_amount > fromAcc.getInitialAmount()) { 
           System.out.println("Withdrawing Amount was bigger than the Initial amount.\nChoose the menu again. ."); 
           break; 
          } 
          //subtracting and adding the withdrawn amount 
          fromAcc.setInitiateAmount(fromAcc.getInitialAmount() - withdraw_amount); 
          toAcc.setInitiateAmount(toAcc.getInitialAmount() + withdraw_amount); 
          System.out.println("DONE!\t print them out to see the current status."); 
          System.out.println(""); 

          break; 
         case 2://deposit/withdraw money in the same accounts 
          bankAccounts2=(List<BankAccount>)rw.readFromFile(); 
          BankAccount fromAcc_SameAcc = null; 
          BankAccount toAcc_SameAcc = null; 
          System.out.println("Enter the account number you want to deposit or withdraw from:"); 
          //read the accNum 
          depOrWithAccountNum = sc.nextInt(); 
          System.out.println("Enter the amount (To withdraw enter a negative value)"); 
          //read the amount 
          depOrWithAmount = sc.nextDouble(); 
          //checking the matching account number in arrayList 
          for (BankAccount listItemsThird : bankAccounts2) { 
           if (listItemsThird.getAccNum() == depOrWithAccountNum) { 
            fromAcc_SameAcc = listItemsThird; 
            break; 
           } 
          } 

          if (depOrWithAmount - 1 < fromAcc_SameAcc.getInitialAmount()) { 
           System.out.println("Withdraw amount is bigger than the current amount.\nChoose the menu again. ."); 
           break; 
          } 

          if (depOrWithAmount < 0) {//the amount is negative 
           fromAcc_SameAcc.setInitiateAmount(fromAcc_SameAcc.getInitialAmount() + depOrWithAmount); 
          } else { 
           fromAcc_SameAcc.setInitiateAmount(fromAcc_SameAcc.getInitialAmount() + depOrWithAmount); 
          } 

          break; 
        } 

        //inner switch-case ends 
        System.out.println("\n\n"); 
        break; 

       case 3: 
        //View One account 
        bankAccounts2=(List<BankAccount>)rw.readFromFile(); 
        BankAccount viewOneAccountNum = null; 

        System.out.println("Enter the account number you want to see:"); 
        viewOneAcc = sc.nextInt(); 
        System.out.println("Name\tAccount No\tInitial Amount"); 
        for (BankAccount viewOneAccountProperty : bankAccounts2) { 

         if (viewOneAccountProperty.getAccNum() == viewOneAcc) { 
          //viewOneAccountNum=viewOneAccountProperty; 
          viewOneAccountNum = viewOneAccountProperty; 

          System.out.println(viewOneAccountNum); 
         } 
         System.out.println(""); 

        } 
        break; 
       case 4: 
        bankAccounts2=(List<BankAccount>)rw.readFromFile(); 
        //BankAccount AccToDel = null; 
        //Deleting an account 
        Iterator<BankAccount> it = bankAccounts2.iterator(); 

        System.out.println("Enter the account you want to delete:"); 
        deleteAcc = sc.nextInt(); 

        while (it.hasNext()) { 
         BankAccount next = it.next(); 
         if (next.getAccNum() == deleteAcc) { 
          it.remove(); 
         } 
        } 

        rw.writeToFile(bankAccounts2); 


        break; 

       case 5: 
        //View all the accounts/printing them out 

        bankAccounts2=(List<BankAccount>)rw.readFromFile(); 
        System.out.println("Name\tAccount No\tInitial Amount"); 
        for (BankAccount bankAccount : bankAccounts2) { 

         System.out.println(bankAccount); 

        } 

        System.out.println("\n\n"); 
        break; 

       case 6: 
        //Quit 
        return; 
      } 

      //switch-case ends 
     } 

    } 

} 

ReaderWriter:

public class ReaderWriter{ 
public void writeToFile(List<BankAccount> accounts){ 
    try { 
      FileOutputStream fos=new FileOutputStream("C:\\Users\\Documents\\NetBeansProjects\\BankFile_assignment.txt"); 
      ObjectOutputStream oos=new ObjectOutputStream(fos); 
      oos.writeObject(accounts);//take the arrayList 
      oos.flush(); 
      oos.close(); 
      fos.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 

    public List<BankAccount> readFromFile(){ 
     List<BankAccount>readData=null; 
     try { 



      FileInputStream fis=new FileInputStream("C:\\Users\Documents\\NetBeansProjects\\BankFile_assignment.txt"); 
      ObjectInputStream ois=new ObjectInputStream(fis); 
      //make an arrayList to get those object back 
      //arrayList 

      readData=(List<BankAccount>)ois.readObject(); 

     ois.close(); 
     fis.close(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
     //return readData; 
     return readData; 


    } 
} 

BankAccount:

package bankapp_assignment; 

import java.io.Serializable; 

public class BankAccount implements Serializable{ 

    private String name; 
    private int accNum; 
    private double initiateAmount; 

    //constructor 
    public BankAccount() { 

     this.name = null; 
     this.accNum = 0; 
     this.initiateAmount = 0; 

    } 

    public void setName(String name) { 
     this.name = name; 

    } 

    public void setAccNum(int accNum) { 

     this.accNum = accNum; 
    } 

    public String getName(String name){ 
     return name; 

    } 


    public int getAccNum() { 
     return accNum; 
    } 


    public void setInitiateAmount(double initiateAmount) { 
     this.initiateAmount = initiateAmount; 
    } 

    public double getInitialAmount(){ 
     return initiateAmount; 
    } 

    @Override 
    public String toString() { 
     return name + "\t\t" + accNum + "\t\t" + initiateAmount; 
    } 

} 
+0

зависит от того, как форматируется текст в файлах, можете ли вы разместить пример содержимого файла tof? –

+0

m.cekiera, да, пожалуйста, я обновил свой пост. Если я получу какую-то помощь, я буду благодарен. – Munira

+0

Я использую содержимое файла .txt, чтобы показать, как вы храните данные, чтобы узнать, как их извлечь;) –

ответ

0
  1. вы должны реорганизовать весь основной метод. Если бы я был вами, я использовал бы основной только для обеденной программы, процесс отдыха другими способами. Таким образом, вы сможете использовать поля класса по всей программе и делить код на многие методы.
  2. Вы должны разделить основное Разногласие между другими методами, по крайней мере, методом за действие, Exemple:

    case 1: 
        createAccount(); 
        break; 
    (...) 
    public void createAccount(){ 
    code from your swich case 1 
    } 
    

    и т.д. Вы все еще можете использовать включатель контроля, но должны replece логики коды к другому методу.

  3. Когда я запускаю ваш код, вход/выход не работал. Вы смогли до сохранить/загрузить файл? Мне пришлось проделывать:

    File file = new File("//file path"); 
    FileOutputStream fos = new FileOutputStream(file); 
    ObjectOutput oos = new ObjectOutputStream(fos); 
    

    То же самое со входом. Тогда это сработало.

  4. Теперь мы попытаемся разобраться с операциями с BankAccounts из файлов. Я немного измениться ваш код от/Вариант 2 Вариант 2: ввод/вывод, давайте посмотрим на нее:

    bankAccounts2 = rw.readFromFile();    // loading list from file 
    BankAccount edited = new BankAccount();   // creating new object 
    System.out.println("Enter the account number you want to deposit or withdraw from:"); 
    double input = sc.nextInt();      // you don't need to create new variable every time you take input form user 
    for(BankAccount account : bankAccounts2){  // every account in list 
         if(account.getAccNum() == input) edited = account; // if acccNum match, give edited reference to chosen account 
    } 
    System.out.println("Enter the amount (To withdraw enter a negative value)"); 
    input = sc.nextDouble(); 
    
    double result = edited.getInitialAmount() + input; // result of operation 
    if(result < 0){ // check if there is enough money on account 
        System.out.println("Withdraw amount is bigger than the current amount.\nChoose the menu again. ."); 
        break; 
    }else{ 
        edited.setInitiateAmount(result);    // if there is, set new value 
    } 
    rw.writeToFile(bankAccounts2);      // save file 
    

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

EDIT:

На вопрос в комментариях.

Поскольку вы используете положительные числа для внесения депозита и отрицательные числа для вывода, операция с initialAmount всегда будет одинаковой: initialAmount + input (если отрицательный, будет вычитаться из суммы), поэтому вы можете рассматривать его как один в вашем коде. В своем коде вы используете эту строку дважды:

fromAcc_SameAcc.setInitiateAmount(fromAcc_SameAcc.getInitialAmount() + depOrWithAmount); 

так что вы уже могли объединить оба дела в одно, чтобы избежать ненужных повторений.Таким образом, только случай, когда действие будет отличаться, когда не хватает денег на счете, вы проверяете его:

if (depOrWithAmount - 1 < fromAcc_SameAcc.getInitialAmount()) 

, но я думаю, что я не буду работать, потому что в отзывать операции depOrWithAmount в отрицательных чисел, так он всегда будет меньше fromAcc_SameAcc.getInitialAmount(). Вы можете использовать:

if (depOrWithAmount < 1 - fromAcc_SameAcc.getInitialAmount()) 

(но я думаю, что это не слишком читаемым) или:

if (Math.abs(depOrWithAmount) > fromAcc_SameAcc.getInitialAmount()){} 

сравнить абсолютное значение ввода с initialAmout. Однако я использовал:

double result = edited.getInitialAmount() + input; 
if(result < 0){...} 

, потому что это дает мне result переменную, которую я могу использовать повторно, если есть достаточно денег, чтобы придает новое значение initialAmount. И если результат отрицательный, это означает, что сумма снятия была больше, чем initialAmount, поэтому для этого недостаточно моне.

Надеюсь, вы нашли что-то полезное в своем посте.

+0

m.cekiera, thnaks, такое приятное предложение! Я последую за запиской. Однако один вопрос: зачем «если (результат <0)»? потому что мы всегда сравниваем сумму с пользовательским вводом, поэтому в этом случае это должно быть: if (input <0). Или я ошибаюсь? – Munira

+0

@Munira я обновил свой ответ –

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