Java: Хэш-карта, содержащая идентификатор ключа и клиента в качестве значения, должна иметь доступ к учетным записям клиента

#java #hashmap

#java #хэш-карта

Вопрос:

У меня есть хэш-карта, которая содержит идентификатор для ключа и клиента в качестве значения. У клиента есть один или несколько банковских счетов. У меня есть отдельный класс Account, в котором есть сведения об учетной записи. Мой класс Client имеет доступ к классу Account, а учетные записи создаются из конструктора в классе Driver. Я хотел бы получить доступ к коллекции учетных записей клиента, но каждый раз, когда я пытаюсь, мне возвращается только одна учетная запись, вместо того, чтобы иметь доступ к любой или ко всем из них. Я создаю учетные записи в классе драйверов и устанавливаю каждую учетную запись для клиента. Есть идеи, как я могу получить доступ к любой или всем учетным записям?

     import java.util.ArrayList;
    
    public class ATM {
    
        private InputReader reader;
        private String accountNumber;
        private String passcode;
        private boolean customerVerified;
        private String customerId;
        private Bank theBank;
        private Bank theBanks;
        private Customer currentCustomer;
        private final int senior = 65;
        
    
        /**
         * Default constructor. Calls the initialize() method to seed the Bank with
         * some Customers. Calls the run() method to perform the primary program
         * functions.
         */
        public ATM() {
            super();
            initialize();
            run();
            
        }
    
        /**
         * Main method calls the class default constructor.
         * @param args for program arguments (not used)
         */
        public static void main(String[] args) {
    
            new ATM();
    
        }
    
        /**
         * The primary application processor. All application functions are c         alled
         * from here. Uses a loop to prompt users to perform banking transactions. 
         * Must use switch/case selection to determine uses choices.
         */
        public void run() {
    
            reader = new InputReader();
            boolean exit = false;
    
            System.out.println("Welcome to Bullwinkle's Bank.");
    
            while (!exit) {
                
                
                
                System.out.println("Choose one of the following options:");
                System.out.println("1 - Sign In");
                System.out.println("2 - Deposit");
                System.out.println("3 - Withdraw");
                System.out.println("4 - Display Account Info");
                System.out.println("5 - Exit");
                System.out.print("> ");
                int choice = reader.getIntInput();
    
                
                
                switch (choice) {
    
                case 1:
                    choice = 1;
                    verifyCustomer();
                    break;
                case 2:
                    choice = 2;
                    
                    transactDeposit();
                    break;
                case 3:
                    choice = 3;
                    transactWithdraw();
                    break;
                case 4:
                    choice = 4;
                    displayAccountInformation();
                    break;
                case 5:
                    choice = 5;
                    System.out
                            .println("Thank you for banking at Bullwinkle's Bank");
                    System.out
                            .println("DEBUG: Displaying all the accounts in the bank.");
                    Bank.displayAllCustomers();
                    System.exit(0);
    
                }
    
            }
    
        }
    
        /**
         * Creates Customer objects by calling overloaded constructor.
         * creates Account objects by calling overloaded constructor.
         * Sets Accounts to Customers.
         * Adds Customer references to the Back HashMap as seed data for testing.
         */
        public void initialize() {
            
            theBank = new Bank();
            
            
            Customer myia = new Customer("Myia", "Dog", "456", "123", 65);
            
            
            
            if (myia.getAge() >= senior) {
                
                ArrayList<Account> accounts = new ArrayList<Account>();
                accounts.add(new SavingsAccount("SA-123", 0.0));
                accounts.add(new GoldAccount("GL-123", 0.0, .01, false));
                for (int j = 0; j < accounts.size(); j  ) {
                Account act = accounts.get(j);
                myia.setAccount(act);
                theBank.addCustomer(myia);
                
                
                System.out.println(myia);
            
                }
                
            
                
                }/*
                        
            Customer freckle = new Customer("Freckle", "Cat", "789", "3", 22);
            freckle.setAccount(new SavingsAccount("SA-789", 0.0));
            theBank.addCustomer(freckle);
            
            
            */
            
            
            
            /*Customer[] cust = {new Customer("Freckle", "Cat", "123", "1", 22), new Customer("Myia", "Dog", "456", "2", 65)};
            Account[] acct = { new SavingsAccount("SA-123", 0.0), new ChequingAccount("CH-123", 0.0, 3)};
            
            
            for(int i = 0; i < cust.length; i  ) {
                cust[i].setAccount(acct[i]);
            }
            
            for (Customer customer : cust) {
                theBank.addCustomer(customer);
            }*/
            
            
    
        }
    
        /**
         * Performs a deposit into a Customer's account. Checks to see if the
         * customer has signed in. If not, then verifyCustomer() is called and the menu
         * is displayed again.
         */
        public void transactDeposit() {
    
            if (customerVerified) {
                
                System.out.println("Enter the amount to deposit: ");
                currentCustomer.getAccount().addToBalance(reader.getDoubleInput());
    
            } else {
    
                System.out
                        .println("ERROR: You must LOGIN before you can perform a transaction.");
                verifyCustomer();
            }
        }
    
        /**
         * Performs a withdrawal from a Customer's account. Checks to see if the
         * customer has signed in. If not, then verifyCustomer() is called and the menu
         * is displayed again.
         */
        public void transactWithdraw() {
    
            if (customerVerified) {
                System.out.println("Enter the amount to withdraw: ");
                double amount = reader.getDoubleInput();
                
                if (amount <= currentCustomer.getAccount().getBalance()) {
                    currentCustomer.getAccount().subtractFromBalance(amount);
                } else {
                    System.out
                            .println("ERROR: You have insufficinet funds to withdraw that amount.");
                }
            } else {
    
                System.out
                        .println("ERROR: You must LOGIN before you can perform a transaction.");
                verifyCustomer();
            }
    
        }
    
        /**
         * Displays a Customer's information if the customer has been
         * previously verified.
         */
        public void displayAccountInformation() {
    
            if (customerVerified) {
                System.out.println("Here is your information.");
                Bank.displayCustomerInformation(currentCustomer);
            } else {
    
                System.out
                        .println("ERROR: You must LOGIN before you can perform a transaction.");
                verifyCustomer();
            }
    
        }
    
        /**
         * Confirms a Customer's account number and passcode. Called when the
         * user is required to sign in to the application. Will set a boolean so the
         * user does not have to sign in again during the session.
         */
        public void verifyCustomer() {
    
            System.out.println("Enter CustomerID: ");
            customerId = reader.getStringInput();
            System.out.println("Enter Passcode: ");
            passcode = reader.getStringInput();
            System.out.println("Enter AccountNumber");
            accountNumber = reader.getStringInput();
            currentCustomer = Bank.theBank.get(customerId);
    
            if (currentCustomer != null) {
                if (passcode.equals(currentCustomer.getPasscode())) {
    
                    customerVerified = true;
                } else{
                    System.out.println("ERROR: Either account number or passcode is not correct.");
                    run();
                }
    
            } else {
                System.out.println("ERROR: Either account number or passcode is not correct.");
                run();
            }
        
    
        
        
            }
        }
    
    
  
     
    import java.util.HashMap;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    
    
    public class Bank {
        private ATM atm; 
    
        /**
         * The bank collection to hold all Customer data.
         * Uses a customer's account number as key and the Customer reference as the value.
         */
        public static  HashMap<String, Customer > theBank;
        public static  HashMap<String, HashMap<String, Customer>> theBanks;
        public static ArrayList<Customer> bankster;
        /**
         * Default constructor for Bank class.
         * Initializes the HashMap
         */
        public Bank() {
            super();
            theBank = new HashMap<String, Customer>();
            bankster = new ArrayList<Customer>();
            theBanks = new HashMap<String, HashMap<String, Customer>>();
        }
    
        /**
         * Add a new Customer to the HashMap.
         * @param newCustomer The new element to add to the HashpMap using 
         * the account number as the key and the new Customer as the value.
         * @param string 
         */
        public void addCustomer(Customer newCustomer) {
    
            if (newCustomer != null) {
                
            
                theBank.put(newCustomer.getCustomerId(), newCustomer);
            }
        }
        
        
    
    
        /**
         * Removes an Customer from the HashMap.
         * @param accountNumber The key of the element to remove from the HashMap.
         */
        public void closeAccount(String customerId, String accountNumber) {
    
            if (accountNumber != null amp;amp; customerId != null) {
    
                theBank.get(customerId).getAccount().setActive(false);
            }
        }
        
        /**
         * Displays the details of a Customer element in the HshMap.
         * Uses Customer.toString() implementation.
         * @param customer the Customer chosen to display.
         */
        public static void displayCustomerInformation(Customer customer){
            
            if(customer != null){
                System.out.println(customer.getAccount().getAccountNumber());
                System.out.println(customer.toString());
                System.out.println(customer);
            }
        }
        
        /**
         * Displays all elements of the HashMap by using Customer.toString() 
         * implementation of each.
         */
        public static void displayAllCustomers(){
            
            for(Customer customer : theBank.values()){
                
                System.out.println(customer);
                for (HashMap<String, Customer> custy : theBanks.values()) {
                    System.out.println(custy);
                }
            
                    
                    for (Customer custer : bankster) {
                        System.out.println(custer);
                        
                    }
                
                
                    
            }
        }
    
    }
    
  
     
    import java.util.*;
    public class Customer {
    
        private String firstName;
        private String lastName;
        private String passcode;
        private Account account;
        private int age; 
        private String customerId;
        
        
    
    
    
        /**
         * Default constructor for a Customer. Sets the fields to the default values
         * for each type.
         */
        public Customer() {
            super();
            
        }
    
        /**
         * @param firstName
         *            String to initialize the firstName field
         * @param lastName
         *            String to initialize the lastName field
         * @param passcode
         *            String to initialize the passcode field
         */
        public Customer(String firstName, String lastName, String passcode,           String customerId, int age) {
            super();
    
            setFirstName(firstName);
            setLastName(lastName);
            setPasscode(passcode);
            setAge(age);
            setCustomerId(customerId);
            account = new Account();
            setAccount(account);
    
        }
    
        /**
         * Accessor for a Cutomer's collection of Accounts
         * 
         * @return a customer account as an Account
         */
        public Account getAccount() {
    
            return account;
        }
        
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            if (age > 17 amp;amp; age <= 120) {
            this.age = age;
            }
        }
    
        public String getCustomerId() {
            return customerId;
        }
    
        public void setCustomerId(String customerId) {
            if (customerId != null) {
            this.customerId = customerId;
            }
        }
    
        /**
         * Mutator for the Account filed
         * 
         * @param account
         *            the Account to set
         */
        public void setAccount(Account account) {
    
            if (account != null) {
    
                this.account = account;
            }
        }
        
        
        
    
        /**
         * Accessor method for the firstName field
         * 
         * @return the firstName as a String
         */
        public String getFirstName() {
            return firstName;
        }
    
        /**
         * Mutator for the firstName field
         * 
         * @param firstName
         *            the firstName to set
         */
        public void setFirstName(String firstName) {
    
            if (firstName != null amp;amp; !firstName.trim().isEmpty()) {
                this.firstName = firstName;
            }
        }
    
        /**
         * Accessor method for the lastName
         * 
         * @return the lastName as a String
         */
        public String getLastName() {
            return lastName;
        }
    
        /**
         * Mutator for the lastName field
         * 
         * @param lastName
         *            the lastName to set
         */
        public void setLastName(String lastName) {
    
            if (lastName != null amp;amp; !lastName.trim().isEmpty()) {
                this.lastName = lastName;
            }
        }
    
        /**
         * Accessor method for the passcode field
         * 
         * @return the passcode as a String
         */
        public String getPasscode() {
            return passcode;
        }
    
        /**
         * Mutator for the passcode field
         * 
         * @param passcode
         *            the passcode to set
         */
        public void setPasscode(String passcode) {
    
            if (passcode != null amp;amp; !passcode.trim().isEmpty()) {
                this.passcode = passcode;
            }
        }
    
        /* (non-Javadoc)
         * @see java.lang.Object#toString()
         */
        
    
        @Override
        public String toString() {
            return "Customer [firstName="   firstName   ", lastName="   lastName   ", passcode="   passcode   ", account="
                      account   ", age="   age   ", customerId="   customerId   ", toString()="   super.toString()   "]";
        }
    
        
    
    }
    
    ------
    
    
    import java.util.ArrayList;
    import java.util.Date;
    public class Account {
    
        private String accountNumber;
        private double balance;
        private boolean active;
        protected ArrayList<String>transactions;
        
        
    
        /**
         * Default constructor to create Account objects
         */
        public Account() {
            super();
            transactions = new ArrayList<String>();
            
        }
    
        /**
         * Overloaded Account constructor
         * 
         * @param accountNumber
         *            to set the accountNumber field
         * @param balance
         *            to set the balance field
         */
        public Account(String accountNumber, double balance) {
            super();
    
            setAccountNumber(accountNumber);
            setBalance(balance);
            transactions = new ArrayList<String>();
            active = true;
        }
        
        
    
        public void setAccountNumber(String accountNumber) {
            if (accountNumber != null) {
                this.accountNumber = accountNumber;
            }
        }
    
        
    
        /**
         * accessor for the accountNumber field
         * 
         * @return the accountNumber as a String
         */
        public String getAccountNumber() {
            
            return accountNumber;
        }
    
        /**
         * accessor for the balance field
         * 
         * @return the balance as a double
         */
        public double getBalance() {
            return balance;
        }
    
        /**
         * accessor for the active field
         * 
         * @return the active boolean
         */
        public boolean isActive() {
            return active;
        }
    
        /**
         * mutator fir the balance field
         * 
         * @param balance
         *            the balance to set
         */
        public void setBalance(double balance) {
            if(balance >= 0){
                this.balance = balance;
                
            }
        }
    
        /**
         * mutator for the active field
         * 
         * @param active
         *            the active to set
         */
        public void setActive(boolean active) {
            this.active = active;
        }   
        
        /**
         * Adds to an Account balance
         * 
         * @param amount
         *            a double to add to the existing balance field
         */
        public void addToBalance(double amount) {
    
            if (amount > 0) {
                balance  = amount;
                addTransactionInfo(String.format("%s - deposit: $%.2f", new Date(), amount));
            }
        }
        
        /**
         * Subtracts from an Account balance
         * 
         * @param amount
         *            a double to subtract from the balance field
         */
        public void subtractFromBalance(double amount) {
            
            if (amount > 0 amp;amp; balance - amount > 0) {
                balance -= amount;
                addTransactionInfo(String.format("%s - deposit: $%.2f", new Date(), amount));
                
            }
        }
        
        
    
        /**
         * method to add to transaction information 
         * @param transaction
         */
        public void addTransactionInfo(String addTransaction) {
            if (addTransaction != null) {
                transactions.add(addTransaction);
            }
        }
        
        /**
         * Method to display the transactions
         */
        public void displayAccountRecords() {
            
                if (transactions.size() > 0) {
                    for (String transacts : transactions) {
                        
                        System.out.println(transacts);
                    }
                }
        }
    
        @Override
        public String toString() {
            return "Account [accountNumber="   accountNumber   ", balance="   balance   ", active="   active
                      ", transactions="   transactions   "]";
        }
    
    ------
    
    import java.util.Date;
    
    public class ChequingAccount extends Account {
        
        private final double FEE = 5.0;
        private int numberOfCheques;
        
        public ChequingAccount() {
            super();
            
        }
        public ChequingAccount(String accountNumber, double balance, int numberOfCheques) {
            super(accountNumber, balance);
            setNumberOfCheques(numberOfCheques);
            
        }
        
        public int getNumberOfCheques() {
            return numberOfCheques;
        }
        
        public void setNumberOfCheques(int numberOfCheques) {
            if (numberOfCheques >= 0) {
            this.numberOfCheques = numberOfCheques;
            }
        }
        
        public double getFEE() {
            return FEE;
        }
        
        /**
         * Adds to an Account balance
         * 
         * @param amount
         *            a double to add to the existing balance field
         */
        public void addToBalance(double amount) {
    
            if (amount > 0) {
                super.addToBalance(amount);
                addTransactionInfo(new Date()   "   Deposit: $"   amount);
            }
        }
        
        /**
         * Subtracts from an Account balance
         * 
         * @param amount
         *            a double to subtract from the balance field
         */
        public void subtractFromBalance(double amount) {
            
            if (super.getBalance() - amount - FEE > 0) {
                super.subtractFromBalance(amount   FEE);
            }else if (super.getBalance() - amount - FEE < 0) {
                    if (super.getBalance() - FEE > 0) {
                        super.subtractFromBalance(0 FEE);
                 }
            }
            
        }
        
    
        
        
        @Override
        public String toString() {
            return "ChequingAccount [FEE="   FEE   ", numberOfCheques="   numberOfCheques   ", toString()="
                      super.toString()   "]";
        }
        
        
        
        
        
    
    }
    
    
    -------

  

Комментарии:

1. Ммм…. Как у вас есть оператор if сразу после public class Driver

2. это всего лишь фрагменты кода, вам нужен полный код?

3. Конечно, я имею в виду, я думаю, что это необходимо, для меня это не имеет смысла… Извините, QAQ

Ответ №1:

По сути, что вам нужно сделать, так это то, что класс Client должен иметь набор, содержащий данные учетной записи для клиента.

 public class Client {
   ....
   private fields
   ....
   private Set<Account> clientAccount;
 
}
  

Карта будет выглядеть следующим образом :

 Map<Integer, Client> 
  

или, что более предпочтительно, с случайно сгенерированными хэшированными идентификаторами клиентов, [как у нас в мире блокчейнов]

 Map<String, client>
  

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

Надеюсь, что это поможет..

Комментарии:

1. кстати, «..» выглядит великолепно, как ты так быстро прочитал ?_?

2. Спасибо 🙂 Я просто попытался быстро разобраться в проблеме.