1.涉及技术点分析:
- 面向对象程序编程:每个用户账户都是一个对象,需要设计账户类Account用于创建账户对象封装账户信息。
- 使用集合容器:系统需要提供一个容器用于存储这些账户对象的信息,选ArrayList集合。
- 程序流程控制:需要结合分支,循环,跳转关键字等相关操作控制程序的业务逻辑。
- 使用常见API:登录信息的内容比较,业务数据的分析,处理等都需要用到String等常用API解决。
2.ATM项目流程:
- 系统准备,首页设计
1.每个用户的账户信息都是一个对象,需要提供账户类(卡号,姓名,密码,余额,取款额度),用于后期创建账户对象封装用户的账户信息。
//定义账户类
public class Account {
//成员变量
private String cardId;//卡号
private String userName;//用户名
private String passWord;//密码
private double money;//账户余额
private double quotaMoney;//每次取款额度
//getter/setter方法
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getQuotaMoney() {
return quotaMoney;
}
public void setQuotaMoney(double quotaMoney) {
this.quotaMoney = quotaMoney;
}
}
2.定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作。
ArrayList<Account> accounts = new ArrayList<>();
3.首页只需要包含:账户登录和账户开户功能。
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("===============ATM模拟系统===============");
System.out.println("1:账户登录");
System.out.println("2:账户开户");
System.out.print("请选择操作:");
int command = sc.nextInt();
switch (command){
case 1://登录
break;
case 2://开户
break;
default:
System.out.println("您输入的操作有误,请重新选择操作。");
}
}
- 用户开户功能实现
/**
* 用户开户功能的实现
* @param accounts 接收的账户集合
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("===============系统开户操作===============");
//1.创建一个账户对象,用于后期封装账户信息
Account account = new Account();
//2.录入当前账户信息,注册到账户对象中去
System.out.print("请输入账户用户名:");
String userName = sc.next();
account.setUserName(userName);
while (true) {
System.out.print("请您输入账户密码:");
String passWord = sc.next();
System.out.print("请您输入确认密码:");
String okPassWord = sc.next();
if (passWord.equals(okPassWord)){
account.setPassWord(passWord);
break;
}else {
System.out.println("sorry,您输入的2次密码不一致,请重新输入。");
}
}
System.out.print("请设置当前账户每次取款额度:");
double quoteMoney = sc.nextDouble();
account.setQuotaMoney(quoteMoney);
//为账户随机一个8位且与其他账户的卡号不重复的号码(独立设置新功能)
String cardID = getRandomCardID(accounts);
account.setCardId(cardID);
//3.把账户对象添加到账户集合中去
accounts.add(account);
System.out.println("恭喜您," + userName + "先生/女士,您开户成功,您的卡号是:" + cardID + ",请您妥善保管卡号。" );
}
/**
* 为账户生成8位与其他账户不重复的卡号
* @return
*/
private static String getRandomCardID(ArrayList<Account> accounts) {
Random r = new Random();
while (true) {//死循环的作用是让系统随机生成的卡号重复后再一次随机生成新卡号
//随机生成8位数的卡号
String cardId = "";
for (int i = 0; i < 8; i++) {
cardId += r.nextInt(10);//0-9的数字上随机选
}
//判断随机新生成的卡号与其他账户卡号是否重复,为了以后转账判断转账卡号是否存在的判断,这里使用一个新方法判断卡号的情况
//根据随机生成的卡号去查询账户对象
Account acc = getAccountByCardId(cardId,accounts);
if (acc == null){//账户不存在,说明该卡号不存在重复,可以新开户
return cardId;
}
}
}
/**
* 根据卡号判断是否能查询出账户对象
* @param cardId 卡号
* @param accounts 全部账户的集合
* @return 账户对象 | null(账户集合不存在该卡号)
*/
private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if (acc.getCardId().equals(cardId)){
return acc;
}
}
return null;//查无账户
}
- 用户登录功能实现
/**
* 登录功能
* @param accounts 全部账户对象的集合
* @param sc 扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("===============系统登录操作===============");
//1.判断账户集合中是否存在账户,不存在是不能进行登录功能
if (accounts.size() == 0){
System.out.println("sorry,当前系统中无任何账户,请先开户再来登录账户。");
}
//2.正式进入登录系统
while (true) {//死循环是为了让用户重新输入存在的卡号
System.out.print("请您输入登录卡号:");
String cardId = sc.next();
//3.判断卡号是否存在,根据卡号去账户集合中查询账户对象,前面开户设置了一个新方法getAccountByCardId()用来查询卡号是否存在
Account acc = getAccountByCardId(cardId,accounts);
if (acc != null){
//卡号存在
while (true) {//死循环为了让用户输入正确的密码进行登录
//4.让用户输入密码,认证密码
System.out.print("请输入您的登录密码:");
String passWord = sc.next();
//判断当前账户密码是否正确
if (acc.getPassWord().equals(passWord)){//密码正确,登陆成功
System.out.println("恭喜您," + acc.getUserName() + "先生/女士进入系统,您的卡号是:" + acc.getCardId());
}else {
System.out.println("sorry,您输入的密码错误");
}
}
}else {
System.out.println("sorry,系统中不存在该卡号。");
}
}
}
- 用户操作页设计,查询账户,退出账户功能实现
/**
* 登录功能
* @param accounts 全部账户对象的集合
* @param sc 扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("===============系统登录操作===============");
//1.判断账户集合中是否存在账户,不存在是不能进行登录功能
if (accounts.size() == 0){
System.out.println("sorry,当前系统中无任何账户,请先开户再来登录账户。");
}
//2.正式进入登录系统
while (true) {//死循环是为了让用户重新输入存在的卡号
System.out.print("请您输入登录卡号:");
String cardId = sc.next();
//3.判断卡号是否存在,根据卡号去账户集合中查询账户对象,前面开户设置了一个新方法getAccountByCardId()用来查询卡号是否存在
Account acc = getAccountByCardId(cardId,accounts);
if (acc != null){
//卡号存在
while (true) {//死循环为了让用户输入正确的密码进行登录
//4.让用户输入密码,认证密码
System.out.print("请输入您的登录密码:");
String passWord = sc.next();
//判断当前账户密码是否正确
if (acc.getPassWord().equals(passWord)){//密码正确,登陆成功
System.out.println("恭喜您," + acc.getUserName() + "先生/女士进入系统,您的卡号是:" + acc.getCardId());
//展示登录后的操作页面
showUserCommand(sc,acc);
//使用完展示页面,退出后,再退出登录界面使用return
return;
}else {
System.out.println("sorry,您输入的密码错误");
}
}
}else {
System.out.println("sorry,系统中不存在该卡号。");
}
}
}
/**
* 展示登录后的操作页
*/
private static void showUserCommand(Scanner sc,Account acc) {
while (true) {
System.out.println("===============用户操作页===============");
System.out.println("1:查询账户");
System.out.println("2:存款");
System.out.println("3:取款");
System.out.println("4:转账");
System.out.println("5:修改密码");
System.out.println("6:退出");
System.out.println("7:注销账号");
System.out.print("请选择您要操作的功能:");
int command = sc.nextInt();
switch (command){
case 1://查询账户(展示当前登录的账户信息)
showAccount(acc);
break;
case 2://存款
break;
case 3://取款
break;
case 4://转账
break;
case 5://修改密码
break;
case 6:
//退出
System.out.println("退出成功,欢迎下次使用。");
return;
case 7://注销账户
break;
default:
System.out.println("您输入的操作错误,请重新选择操作。");
}
}
}
/**
* 查询账户功能,展示账户信息
* @param acc
*/
private static void showAccount(Account acc) {
System.out.println("===============当前账户信息如下===============");
System.out.println("卡号:" + acc.getCardId());
System.out.println("户主:" + acc.getUserName());
System.out.println("余额:" + acc.getMoney());
System.out.println("限额:" + acc.getQuotaMoney());
}
- 用户存款功能实现
/**
* 存款功能的实现
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("===============用户存款操作===============");
System.out.print("请输入您要存款的金额:");
double money = sc.nextDouble();
//更新账户余额:原来的金额+存款金额
acc.setMoney(acc.getMoney() + money);
System.out.println("恭喜您,存钱成功,当前账户信息如下:");
showAccount(acc);
}
- 用户取款功能实现
/**
* 取款功能的实现
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("===============用户存款操作===============");
//1.判断存款是否足够100块钱
if (acc.getMoney() < 100){
System.out.println("sorry,当前账户余额不足100元,不能取钱。");
return;
}
while (true) {//死循环是为了让用户满足输入的取款金额在取款额度内
//2.提示用户输入取钱金额
System.out.print("请您输入取款金额:");
double money = sc.nextDouble();
//3.判断取款金额是否满足每次取款限额
if (money > acc.getQuotaMoney()){
System.out.println("sorry,您当前取款超过每次限额,每次最多可取:" + acc.getQuotaMoney());
}else {
//满足在取款限额内,需要再判断是否在账户总余额内
if (money > acc.getMoney()){
System.out.println("余额不足,您账户目前总金额是:" + acc.getMoney());
}else {
System.out.println("恭喜您,取款" + money + "元成功。");
//更新总余额
acc.setMoney(acc.getMoney() - money);
showAccount(acc);
return;//结束取款功能
}
}
}
}
- 用户转账功能实现
/**
* 转账功能的实现
* @param sc 扫描器
* @param acc 自己的账户对象
* @param accounts 全部账户集合
*/
private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {
System.out.println("===============用户转账操作===============");
//1.判断是否足够两个账户,不够是不能进行转账
if (accounts.size() < 2){
System.out.println("当前系统中,不足两个账户,不能进行转账,请去开户。");
return;//跳出转账功能
}
//2.判断自己的账户是否有钱
if (acc.getMoney() == 0){
System.out.println("sorry,您的账户余额为0,不能进行转账。");
return;
}
while (true) {//死循环是为了实现让用户输入的卡号存在,不是自己的卡号,姓氏认证通过
//3.正真开始转账
System.out.print("请输入对方账户的卡号:");
String cardId = sc.next();
//判断输入的卡号是否是自己的卡号
if (cardId.equals(acc.getCardId())){
System.out.println("sorry,您输入的卡号是自己的卡号,不能给自己转账。");
continue;//结束当次执行,死循环进入下一次
}
//判断卡号是否存在,根据这卡号去查询对方账户对象
Account account = getAccountByCardId(cardId,accounts);//会返回账户对象信息,对方的账户会用于下面给对方转账使用
if (account == null){
System.out.println("sorry,您输入对方的这个卡号不存在");
}else {
//这个账户存在,继续认证对方的姓氏信息
String userName = account.getUserName();//用户的全名
String tip = "*" + userName.substring(1);
System.out.print("请输入[" + tip + "]的姓氏:");
String preName = sc.next();
//判断认证的姓氏是否正确
if (userName.startsWith(preName)){//startWith():以什么开始
while (true) {//死循环为了保证转账金额在余额内
//认证通过,开始正真转账
System.out.print("请您输入转账金额:");
double money = sc.nextDouble();
//判断余额是否足够
if (money > acc.getMoney()){
System.out.println("sorry,您的余额不足,您最多可以转账:" + acc.getMoney());
}else {
acc.setMoney(acc.getMoney() - money);//自己的账户
account.setMoney(account.getMoney() + money);//对方的账户
System.out.println("转账成功,您的账户还剩余:" + acc.getMoney());
return;//结束转账功能
}
}
}else {
System.out.println("sorry,您输入的姓氏认证有误。");
}
}
}
}
- 用户密码修改,注销用户功能实现
1.修改用户密码
/**
* 修改密码功能的实现
* @param sc 扫描器
* @param acc 当前登录成功的账户对象
*/
private static void updatePassWord(Scanner sc, Account acc) {
System.out.println("===============账户修改密码操作===============");
while (true) {
System.out.print("请您输入当前密码:");
String passWord = sc.next();
//1.判断这个密码是否正确
if (acc.getPassWord().equals(passWord)){
while (true) {//死循环为了保证用户两次输入密码是一致的
//密码认证正确,输入新密码
System.out.print("请您输入新密码:");
String newPassWord = sc.next();
System.out.print("请您确认新密码:");
String okPassWord = sc.next();
if (newPassWord.equals(okPassWord)){
acc.setPassWord(newPassWord);
System.out.println("恭喜您,您的密码修改成功了。");
return;//结束修改密码功能
}else {
System.out.println("您输入的两次密码不一致。");
}
}
}else {
System.out.println("您输入的密码不正确。");
}
}
}
2.注销用户
/**
* 注销账户功能的实现
* @param acc 当前要注销的账户对象
* @param sc 扫描器
* @param accounts 全部账户集合
*/
private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {
System.out.println("===============注销账户操作===============");
System.out.print("您确定要注销账户吗?y/n:");
String rs = sc.next();
switch (rs){
case "y"://确定销户
if (acc.getMoney() > 0){
System.out.println("您的账户还有余额,请全部取走再进行销户。");
}else {
accounts.remove(acc);//从账户集合中注销要注销的账户
System.out.println("您的账户完成销户。");
return true;
}
break;
default:
System.out.println("好的,当前账户为您继续保留。");
}
return false;
}
3.ATM项目整体流程:
//ATM模拟系统
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATMSystem {
public static void main(String[] args) {
//1.定义账户类
//2.定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作。
ArrayList<Account> accounts = new ArrayList<>();
//3.展示系统首页
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("===============ATM模拟系统===============");
System.out.println("1:账户登录");
System.out.println("2:账户开户");
System.out.print("请选择操作:");
int command = sc.nextInt();
switch (command){
case 1://登录
login(accounts,sc);
break;
case 2://开户
register(accounts,sc);
break;
default:
System.out.println("您输入的操作有误,请重新选择操作。");
}
}
}
/**
* 登录功能
* @param accounts 全部账户对象的集合
* @param sc 扫描器
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("===============系统登录操作===============");
//1.判断账户集合中是否存在账户,不存在是不能进行登录功能
if (accounts.size() == 0){
System.out.println("sorry,当前系统中无任何账户,请先开户再来登录账户。");
}
//2.正式进入登录系统
while (true) {//死循环是为了让用户重新输入存在的卡号
System.out.print("请您输入登录卡号:");
String cardId = sc.next();
//3.判断卡号是否存在,根据卡号去账户集合中查询账户对象,前面开户设置了一个新方法getAccountByCardId()用来查询卡号是否存在
Account acc = getAccountByCardId(cardId,accounts);
if (acc != null){
//卡号存在
while (true) {//死循环为了让用户输入正确的密码进行登录
//4.让用户输入密码,认证密码
System.out.print("请输入您的登录密码:");
String passWord = sc.next();
//判断当前账户密码是否正确
if (acc.getPassWord().equals(passWord)){//密码正确,登陆成功
System.out.println("恭喜您," + acc.getUserName() + "先生/女士进入系统,您的卡号是:" + acc.getCardId());
//展示登录后的操作页面
showUserCommand(sc,acc,accounts);
//使用完展示页面,退出后,再退出登录界面使用return
return;
}else {
System.out.println("sorry,您输入的密码错误");
}
}
}else {
System.out.println("sorry,系统中不存在该卡号。");
}
}
}
/**
* 展示登录后的操作页
*/
private static void showUserCommand(Scanner sc,Account acc,ArrayList<Account> accounts) {
while (true) {
System.out.println("===============用户操作页===============");
System.out.println("1:查询账户");
System.out.println("2:存款");
System.out.println("3:取款");
System.out.println("4:转账");
System.out.println("5:修改密码");
System.out.println("6:退出");
System.out.println("7:注销账号");
System.out.print("请选择您要操作的功能:");
int command = sc.nextInt();
switch (command){
case 1://查询账户(展示当前登录的账户信息)
showAccount(acc);
break;
case 2://存款
depositMoney(acc,sc);
break;
case 3://取款
//设置余额低于100不可以取款
drawMoney(acc,sc);
break;
case 4://转账
transferMoney(sc,acc,accounts);
break;
case 5://修改密码
updatePassWord(sc,acc);
return;//结束功能操作功能,去重新进入首页界面去重新登录账户
case 6:
//退出
System.out.println("退出成功,欢迎下次使用。");
return;
case 7://注销账户
//从当前账户集合中,删除当前账户对象,销毁就完成了
//if判断语句中使用布尔值作为判断式,只有boolean为true才会执行
if (deleteAccount(acc,sc,accounts)){
return;//结束功能操作,回到首页
}else {
break;//再一次进行操作功能的选择
}
default:
System.out.println("您输入的操作错误,请重新选择操作。");
}
}
}
/**
* 注销账户功能的实现
* @param acc 当前要注销的账户对象
* @param sc 扫描器
* @param accounts 全部账户集合
*/
private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {
System.out.println("===============注销账户操作===============");
System.out.print("您确定要注销账户吗?y/n:");
String rs = sc.next();
switch (rs){
case "y"://确定销户
if (acc.getMoney() > 0){
System.out.println("您的账户还有余额,请全部取走再进行销户。");
}else {
accounts.remove(acc);//从账户集合中注销要注销的账户
System.out.println("您的账户完成销户。");
return true;
}
break;
default:
System.out.println("好的,当前账户为您继续保留。");
}
return false;
}
/**
* 修改密码功能的实现
* @param sc 扫描器
* @param acc 当前登录成功的账户对象
*/
private static void updatePassWord(Scanner sc, Account acc) {
System.out.println("===============账户修改密码操作===============");
while (true) {
System.out.print("请您输入当前密码:");
String passWord = sc.next();
//1.判断这个密码是否正确
if (acc.getPassWord().equals(passWord)){
while (true) {//死循环为了保证用户两次输入密码是一致的
//密码认证正确,输入新密码
System.out.print("请您输入新密码:");
String newPassWord = sc.next();
System.out.print("请您确认新密码:");
String okPassWord = sc.next();
if (newPassWord.equals(okPassWord)){
acc.setPassWord(newPassWord);
System.out.println("恭喜您,您的密码修改成功了。");
return;//结束修改密码功能
}else {
System.out.println("您输入的两次密码不一致。");
}
}
}else {
System.out.println("您输入的密码不正确。");
}
}
}
/**
* 转账功能的实现
* @param sc 扫描器
* @param acc 自己的账户对象
* @param accounts 全部账户集合
*/
private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {
System.out.println("===============用户转账操作===============");
//1.判断是否足够两个账户,不够是不能进行转账
if (accounts.size() < 2){
System.out.println("当前系统中,不足两个账户,不能进行转账,请去开户。");
return;//跳出转账功能
}
//2.判断自己的账户是否有钱
if (acc.getMoney() == 0){
System.out.println("sorry,您的账户余额为0,不能进行转账。");
return;
}
while (true) {//死循环是为了实现让用户输入的卡号存在,不是自己的卡号,姓氏认证通过
//3.正真开始转账
System.out.print("请输入对方账户的卡号:");
String cardId = sc.next();
//判断输入的卡号是否是自己的卡号
if (cardId.equals(acc.getCardId())){
System.out.println("sorry,您输入的卡号是自己的卡号,不能给自己转账。");
continue;//结束当次执行,死循环进入下一次
}
//判断卡号是否存在,根据这卡号去查询对方账户对象
Account account = getAccountByCardId(cardId,accounts);//会返回账户对象信息,对方的账户会用于下面给对方转账使用
if (account == null){
System.out.println("sorry,您输入对方的这个卡号不存在");
}else {
//这个账户存在,继续认证对方的姓氏信息
String userName = account.getUserName();//用户的全名
String tip = "*" + userName.substring(1);
System.out.print("请输入[" + tip + "]的姓氏:");
String preName = sc.next();
//判断认证的姓氏是否正确
if (userName.startsWith(preName)){//startWith():以什么开始
while (true) {//死循环为了保证转账金额在余额内
//认证通过,开始正真转账
System.out.print("请您输入转账金额:");
double money = sc.nextDouble();
//判断余额是否足够
if (money > acc.getMoney()){
System.out.println("sorry,您的余额不足,您最多可以转账:" + acc.getMoney());
}else {
acc.setMoney(acc.getMoney() - money);//自己的账户
account.setMoney(account.getMoney() + money);//对方的账户
System.out.println("转账成功,您的账户还剩余:" + acc.getMoney());
return;//结束转账功能
}
}
}else {
System.out.println("sorry,您输入的姓氏认证有误。");
}
}
}
}
/**
* 取款功能的实现
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void drawMoney(Account acc, Scanner sc) {
System.out.println("===============用户存款操作===============");
//1.判断存款是否足够100块钱
if (acc.getMoney() < 100){
System.out.println("sorry,当前账户余额不足100元,不能取钱。");
return;
}
while (true) {//死循环是为了让用户满足输入的取款金额在取款额度内
//2.提示用户输入取钱金额
System.out.print("请您输入取款金额:");
double money = sc.nextDouble();
//3.判断取款金额是否满足每次取款限额
if (money > acc.getQuotaMoney()){
System.out.println("sorry,您当前取款超过每次限额,每次最多可取:" + acc.getQuotaMoney());
}else {
//满足在取款限额内,需要再判断是否在账户总余额内
if (money > acc.getMoney()){
System.out.println("余额不足,您账户目前总金额是:" + acc.getMoney());
}else {
System.out.println("恭喜您,取款" + money + "元成功。");
//更新总余额
acc.setMoney(acc.getMoney() - money);
showAccount(acc);
return;//结束取款功能
}
}
}
}
/**
* 存款功能的实现
* @param acc 当前账户对象
* @param sc 扫描器
*/
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("===============用户存款操作===============");
System.out.print("请输入您要存款的金额:");
double money = sc.nextDouble();
//更新账户余额:原来的金额+存款金额
acc.setMoney(acc.getMoney() + money);
System.out.println("恭喜您,存钱成功,当前账户信息如下:");
showAccount(acc);
}
/**
* 查询账户功能,展示账户信息
* @param acc
*/
private static void showAccount(Account acc) {
System.out.println("===============当前账户信息如下===============");
System.out.println("卡号:" + acc.getCardId());
System.out.println("户主:" + acc.getUserName());
System.out.println("余额:" + acc.getMoney());
System.out.println("限额:" + acc.getQuotaMoney());
}
/**
* 用户开户功能的实现
* @param accounts 接收的账户集合
*/
private static void register(ArrayList<Account> accounts,Scanner sc) {
System.out.println("===============系统开户操作===============");
//1.创建一个账户对象,用于后期封装账户信息
Account account = new Account();
//2.录入当前账户信息,注册到账户对象中去
System.out.print("请输入账户用户名:");
String userName = sc.next();
account.setUserName(userName);
while (true) {
System.out.print("请您输入账户密码:");
String passWord = sc.next();
System.out.print("请您输入确认密码:");
String okPassWord = sc.next();
if (passWord.equals(okPassWord)){
account.setPassWord(passWord);
break;
}else {
System.out.println("sorry,您输入的2次密码不一致,请重新输入。");
}
}
System.out.print("请设置当前账户每次取款额度:");
double quoteMoney = sc.nextDouble();
account.setQuotaMoney(quoteMoney);
//为账户随机一个8位且与其他账户的卡号不重复的号码(独立设置新功能)
String cardID = getRandomCardID(accounts);
account.setCardId(cardID);
//3.把账户对象添加到账户集合中去
accounts.add(account);
System.out.println("恭喜您," + userName + "先生/女士,您开户成功,您的卡号是:" + cardID + ",请您妥善保管卡号。" );
}
/**
* 为账户生成8位与其他账户不重复的卡号
* @return
*/
private static String getRandomCardID(ArrayList<Account> accounts) {
Random r = new Random();
while (true) {//死循环的作用是让系统随机生成的卡号重复后再一次随机生成新卡号
//随机生成8位数的卡号
String cardId = "";
for (int i = 0; i < 8; i++) {
cardId += r.nextInt(10);//0-9的数字上随机选
}
//判断随机新生成的卡号与其他账户卡号是否重复,为了以后转账判断转账卡号是否存在的判断,这里使用一个新方法判断卡号的情况
//根据随机生成的卡号去查询账户对象
Account acc = getAccountByCardId(cardId,accounts);
if (acc == null){//账户不存在,说明该卡号不存在重复,可以新开户
return cardId;
}
}
}
/**
* 根据卡号判断是否能查询出账户对象
* @param cardId 卡号
* @param accounts 全部账户的集合
* @return 账户对象 | null(账户集合不存在该卡号)
*/
private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
if (acc.getCardId().equals(cardId)){
return acc;
}
}
return null;//查无账户
}
}