🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] # ArrayList 增删改查案例 1. List 作为 ArrayList的接口 实现了List 中接口的方法,同样具备一下操作 2. `ArrayList() `,创建一个长度为0的集合 * `boolean add(E e) 添加` * `boolean remove(E e) 删除` * `E remove(int index) 删除指定位置` * `E set(int index,E e) 修改` * `E get(int index) 查询` * `int size() 获取长度` ~~~ import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { /* * boolean add(E e) 添加 * * boolean remove(E e) 删除 * E remove(int index) * * E set(int index,E e) 修改 * * E get(int index) 查询 * int size() 获取长度 * */ ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); // 删除内容 boolean remove1 = list.remove("aaa"); System.out.print(remove1); // true // 通过序号删除内容 String rm = list.remove(0); System.out.println(rm); // bbb // 修改指定位置内容 String update = list.set(0, "123"); System.out.print(update); // ccc 返回被修改内容 // 获取指定位置内容 String str = list.get(0); System.out.print(str); // 123 // 获取长度 int len = list.size(); System.out.print(len); // 2 } } ~~~ >[danger] ## 集合中包装类 1. 数组可以保存基本类型或者引用类型,集合是引用类型,如果保存基本类型需要使用其**包装类** ~~~ import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { // 定义保存int 类型数据 就需要使用int 的包装类Integer ArrayList<Integer> intLs = new ArrayList<>(); // 增 intLs.add(1); intLs.add(2); // 删 指定内容值 Integer i = 1; intLs.remove(i); // 删除指定位置的值 intLs.remove(0); // 获取长度 int size = intLs.size(); System.out.print(size); // 0 // 新增后更新值 intLs.add(789); intLs.set(0, 1223456); // 打印值 Integer ii = intLs.get(0); System.out.print(ii); // 1223456 } } ~~~ >[info] ## 简单学生管理 1. 具备可以手动输入学生数据 2. 可以根据学号查找某个学生是否存在 3. 可以打印出某个学号学生的具体信息 4. 可以统计成绩不及格人数据打印 5. 可以打印所有学生数据 >[danger] ##### 创建学生的javaBean -- Student ~~~ public class Student { // 私有化成员变量 private int id; private String name; private int age; private int scores; // 构造方法 public Student(int id, String name, int age, int scores) { this.id = id; this.name = name; this.age = age; this.scores = scores; } public Student() { } // get/set方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getScores() { return scores; } public void setScores(int scores) { this.scores = scores; } } ~~~ >[danger] ##### 实现功能的方法类 -- StudentTest ~~~ import java.util.ArrayList; import java.util.Scanner; import javax.swing.text.html.HTMLDocument.RunElement; /** * * 1. 具备可以手动输入学生数据 * 2. 可以根据学号查找某个学生是否存在 * 3. 可以打印出某个学号学生的具体信息 * 4. 可以统计成绩不及格人数据打印 * 5. 可以打印所有学生数据 */ public class StudentTest { public static void main(String[] args) { // 开始录入 Scanner sc = new Scanner(System.in); System.out.println("请输入录入人数"); int count = sc.nextInt(); // 获取录入list ArrayList<Student> students = enterStudentsInfo(count); // 输入要查找id System.out.println("输入要查找id"); int id = sc.nextInt(); if (contains(students, id)) { int index = getIndexById(students, id); Student stu = students.get(index); System.out.print(stu.getName()); } else { System.out.println("当前学生不存在"); } } // 录入学生 public static ArrayList<Student> enterStudentsInfo(int count) { Scanner sc = new Scanner(System.in); // 创建一个录入集合 ArrayList<Student> studentLs = new ArrayList<>(); for (int i = 0; i < count; i++) { Student stu = new Student(); System.out.println("输入学生ID"); int Id = sc.nextInt(); stu.setId(Id); System.out.println("请输入学生名字"); String name = sc.next(); stu.setName(name); System.out.println("请输入学生年龄"); int age = sc.nextInt(); stu.setAge(age); System.out.print("请输入学生分数"); double scores = sc.nextDouble(); stu.setScores(scores); // 保存学生 studentLs.add(stu); } return studentLs; } // 根据Id 获得索引位置 public static int getIndexById(ArrayList<Student> arr, int id) { for (int i = 0; i < arr.size(); i++) { Student stu = arr.get(i); if (stu.getId() == id) { return i; } } return -1; } // 是否包含 public static boolean contains(ArrayList<Student> arr, int id) { return getIndexById(arr, id) >= 0; } // 获取不及格信息 public static ArrayList<Student> getLtSources60(ArrayList<Student> arr) { ArrayList<Student> stuLs = new ArrayList<>(); for (int i = 0; i < arr.size(); i++) { Student stu = arr.get(i); double sources = stu.getScores(); if (sources < 60) { stuLs.add(stu); } } return stuLs; } } ~~~ >[info] ## 用户登录注册 1. 学生管理系统书写一个登陆、注册、忘记密码的功能 2. 需求文档: * 用户类: 属性:用户名、密码、身份证号码、手机号码 * 注册功能: 用户名唯一 用户名长度必须在3~15位之间 只能是字母加数字的组合,但是不能是纯数字 密码键盘输入两次,两次一致才可以进行注册。 身份证号码需要验证,**长度为18位,不能以0为开头,前17位,必须都是数字,最后一位可以是数字,也可以是大写X或小写x** 手机号验证**长度为11位不能以0为开头必须都是数字** * 登录功能:键盘录入用户名,键盘录入密码,键盘录入验证码 **验证要求**:用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册 ,判断验证码是否正确,如不正确,重新输入再判断用户名和密码是否正确,有3次机会 * 忘记密码:键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册。键盘录入身份证号码和手机号码,判断当前用户的身份证号码和手机号码是否一致,如果一致,则提示输入密码,进行修改。如果不一致,则提示:账号信息不匹配,修改失败。 * 验证码规则:长度为5,由4位大写或者小写字母和1位数字组成,同一个字母可重复 数字可以出现在任意位置 >[danger] ##### 创建用户的javaBean类 -- User ~~~ public class User { // 定义私有变量 private String name; private String password; private String personID; private String phoneNum; // 创建有参无参构造 public User() { } public User(String name, String password, String personID, String phoneNum) { this.name = name; this.password = password; this.personID = personID; this.phoneNum = phoneNum; } // 使用访问的get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPersonID() { return personID; } public void setPersonID(String personID) { this.personID = personID; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } } ~~~ >[danger] ##### 登录界面 ~~~ import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class UserTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 保存记录的list ArrayList<User> ls = new ArrayList<>(); while (true) { // 绘制注册页面 System.out.println("欢迎来到学生管理系统"); System.out.println("请选择操作:1登录 2注册 3忘记密码"); // 开始进行分配 String choose = sc.next(); switch (choose) { case "1" -> login(ls); case "2" -> register(ls); case "3" -> forgetPassword(ls); case "4" -> { System.out.println("谢谢使用,再见"); System.exit(0);// 强制退出 } default -> System.out.println("没有这个选项"); } } } private static void printList(ArrayList<User> list) { for (int i = 0; i < list.size(); i++) { // i 索引 User user = list.get(i); System.out.println(user.getName() + ", " + user.getPassword() + ", " + user.getPersonID() + ", " + user.getPhoneNum()); } } public static void login(ArrayList<User> list) { Scanner sc = new Scanner(System.in); for (int i = 0; i < 3; i++) { System.out.println("请输入用户名"); String username = sc.next(); // 判断用户名是否存在 boolean flag = contains(list, username); if (!flag) { System.out.println("用户名" + username + "未注册,请先注册再登录"); return; } System.out.println("请输入密码"); String password = sc.next(); while (true) { String rightCode = getCode(); System.out.println("当前正确的验证码为:" + rightCode); System.out.println("请输入验证码"); String code = sc.next(); if (code.equalsIgnoreCase(rightCode)) { System.out.println("验证码正确"); break; } else { System.out.println("验证码错误"); continue; } } // 验证用户名和密码是否正确 // 集合中是否包含用户名和密码 // 定义一个方法验证用户名和密码是否正确 // 封装思想的应用: // 我们可以把一些零散的数据,封装成一个对象 // 以后传递参数的时候,只要传递一个整体就可以了,不需要管这些零散的数据。 User useInfo = new User(username, password, null, null); boolean result = checkUserInfo(list, useInfo); if (result) { System.out.println("登录成功,可以开始使用学生管理系统了"); break; } else { System.out.println("登录失败,用户名或密码错误"); if (i == 2) { System.out.println("当前账号" + username + "被锁定,请联系黑马程序员客服:XXX-XXXXX"); // 当前账号锁定之后,直接结束方法即可 return; } else { System.out.println("用户名或密码错误,还剩下" + (2 - i) + "次机会"); } } } } public static void register(ArrayList<User> ls) { Scanner sc = new Scanner(System.in); /* * 校验用户名 * 用户名长度必须在3~15位之间 * 只能是字母加数字的组合,但是不能是纯数字 * * 整个用户名也可能不是一次输入对的因此需要循环 */ String username; while (true) { System.out.println("请输入用户名称"); username = sc.next(); boolean flagName = checkUsername(username); // 不满足需要重新输入用户名 if (!flagName) { System.out.println("用户名格式不满足条件,需要重新输入"); continue; } // 校验用户名是否唯一 boolean flag2 = contains(ls, username); if (flag2) { // 用户名已存在,那么当前用户名无法注册,需要重新输入 System.out.println("用户名" + username + "已存在,请重新输入"); } else { // 不存在,表示当前用户名可用,可以继续录入下面的其他数据 System.out.println("用户名" + username + "可用"); break; } } // 密码键盘输入两次,两次一致才可以进行注册 String pwd; while (true) { System.out.println("请输入要注册的密码"); pwd = sc.next(); System.out.println("请再次输入要注册的密码"); String aginPwd = sc.next(); if (!pwd.equals(aginPwd)) { System.out.println("两次密码输入不一致,请重新输入"); continue; } System.out.println("两次密码一致,继续录入其他数据"); break; } // 身份证号码需要验证。 // ​ 验证要求: // ​ 长度为18位 // ​ 不能以0为开头 // ​ 前17位,必须都是数字 // ​ 最为一位可以是数字,也可以是大写X或小写x String id; while (true) { System.out.println("请输入身份证号码"); id = sc.next(); if (checkPersonId(id)) { break; } else { System.out.println("身份证号码格式有误,请重新输入"); continue; } } // 手机号验证。 // ​ 验证要求: // ​ 长度为11位 // ​ 不能以0为开头 // ​ 必须都是数字 String phoneNum; while (true) { System.out.println("请输入手机号码"); phoneNum = sc.next(); boolean flag = checkPhoneNum(phoneNum); if (flag) { break; } else { System.out.println("手机号码格式有误,请重新输入"); } } // 用户名,密码,身份证号码,手机号码放到用户对象中 User u = new User(username, pwd, id, phoneNum); // 把用户对象添加到集合中 ls.add(u); System.out.println("注册成功"); printList(ls); }; public static void forgetPassword(ArrayList<User> list) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); String username = sc.next(); boolean flag = contains(list, username); if (!flag) { System.out.println("当前用户" + username + "未注册,请先注册"); return; } // 键盘录入身份证号码和手机号码 System.out.println("请输入身份证号码"); String personID = sc.next(); System.out.println("请输入手机号码"); String phoneNumber = sc.next(); // 需要把用户对象通过索引先获取出来。 int index = findIndex(list, username); User user = list.get(index); // 比较用户对象中的手机号码和身份证号码是否相同 if (!(user.getPersonID().equalsIgnoreCase(personID) && user.getPhoneNum().equals(phoneNumber))) { System.out.println("身份证号码或手机号码输入有误,不能修改密码"); return; } // 当代码执行到这里,表示所有的数据全部验证成功,直接修改即可 String password; while (true) { System.out.println("请输入新的密码"); password = sc.next(); System.out.println("请再次输入新的密码"); String againPassword = sc.next(); if (password.equals(againPassword)) { System.out.println("两次密码输入一致"); break; } else { System.out.println("两次密码输入不一致,请重新输入"); continue; } } // 直接修改即可 user.setPassword(password); System.out.println("密码修改成功"); } private static int findIndex(ArrayList<User> list, String username) { for (int i = 0; i < list.size(); i++) { User user = list.get(i); if (user.getName().equals(username)) { return i; } } return -1; } private static boolean checkUserInfo(ArrayList<User> list, User useInfo) { // 遍历集合,判断用户是否存在,如果存在登录成功,如果不存在登录失败 for (int i = 0; i < list.size(); i++) { User user = list.get(i); if (user.getName().equals(useInfo.getName()) && user.getPassword().equals(useInfo.getPassword())) { return true; } } return false; } // 校验手机号 public static boolean checkPhoneNum(String phoneNum) { int len = phoneNum.length(); if (len != 11) { return false; } if (phoneNum.startsWith("0")) { return false; } for (int i = 0; i < len; i++) { char c = phoneNum.charAt(i); if (c < '0' || c > '9') { return false; } } return true; } // 校验身份证号 public static boolean checkPersonId(String id) { int len = id.length(); if (len != 18) { return false; } if (id.startsWith("0")) { return false; } // 第18 位 比较特殊 可以先校验 17 位 for (int i = 0; i < len; i++) { char c = id.charAt(i); // 如果有一个字符不在0-9之间,那么直接返回false if (!(c >= '0' && c <= '9')) { return false; } } // 单独校验18位置 char endC = id.charAt(id.length() - 1); if (!(endC >= '0' && endC <= '9') && endC != 'x' && endC != 'X') { return false; } return true; } // 校验用户名 public static boolean checkUsername(String userName) { /* * 用户名长度必须在3~15位之间 * 只能是字母加数字的组合,但是不能是纯数字 */ int len = userName.length(); if (len < 3 || len > 15) { return false; } // 判断是否除了数字和字母 for (int i = 0; i < len; i++) { char c = userName.charAt(i); if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) { return false; } } // 要看看实际是否包含英文 int count = 0; for (int i = 0; i < len; i++) { // i 索引 char c = userName.charAt(i); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { count++; break; } } return count > 0; } // 是否包含 public static boolean contains(ArrayList<User> ls, String name) { for (int i = 0; i < ls.size(); i++) { User user = ls.get(i); if (user.getName().equals(name)) { return true; } } return false; } // 生成验证码 public static String getCode() { // 生成 a-z 和 A-z 的字符串ls ArrayList<Character> list = new ArrayList<>(); for (int i = 0; i < 26; i++) { list.add((char) ('a' + i)); list.add((char) ('A' + i)); } StringBuffer sb = new StringBuffer(); Random r = new Random(); // 随机从ls 中取值 for (int i = 0; i < 4; i++) { // 获取随机索引 int index = r.nextInt(list.size()); // 利用随机索引获取字符 char c = list.get(index); // 把随机字符添加到sb当中 sb.append(c); } int number = r.nextInt(10); sb.append(number); // 数字是随机位置 // 先把字符串变成字符数组,在数组中修改,然后再创建一个新的字符串 char[] arr = sb.toString().toCharArray(); // 拿着最后一个索引,跟随机索引进行交换 int randomIndex = r.nextInt(arr.length); // 最大索引指向的元素 跟随机索引指向的元素交换 char temp = arr[randomIndex]; arr[randomIndex] = arr[arr.length - 1]; arr[arr.length - 1] = temp; return new String(arr); } } ~~~