黑马Java0基础课程学习记录第14天(p111-p120)-5.15

集合+学生信息管理系统(普通+升级)——前120总结性练习

1.集合和数组对比

1.长度不定,可长可短

2.不能直接接收基本数据类型,需要包装成对应的类,可以接受引用数据类型

2.ArrayList<E>

2.1 创建形式:

ArrayList<泛型:限定集合中存储的数据类型>   名字  = new ArrayList<>();

补充说明:

打印出来不是地址值,而是一个被[]包裹的

2.2 成员方法(注意看返回值是什么

增加:无论加什么都返回true,可以不管

【aaa,aaa,bbb,ccc】

删除:删除指定元素,返回是否成功;删除索引元素,返回被删除元素

结果:

修改:返回原来的元素

遍历:查询+size()

2.3 ArrayList存储字符串并遍历

 案例需求

创建一个存储字符串的集合,存储3个字符串元素,使用程序实现在控制台遍历该集合,形成类似[a,b,c].

import java.util.ArrayList;
//创建一个存储字符串的集合,存储3个字符串元素,使用程序实现在控制台遍历该集合
public class arrayTest1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            if (i==list.size()-1){
                System.out.print(str);
            }else {
                System.out.print(str+",");
            }
        }
        System.out.println("]");
    }
}

2.4 ArrayList存储学生对象并遍历

案例需求(先创建学生的类。单独封装)

创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

import java.util.ArrayList;

public class arrayStudent {
//  创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
    public static void main(String[] args) {
        ArrayList<student> list =new ArrayList<>();
        student sc1 = new student("liangzhen",22);
        student sc2 = new student("linsong",21);
        student sc3 = new student("peng",23);
        list.add(sc1);
        list.add(sc2);
        list.add(sc3);
        for (int i = 0; i < list.size(); i++) {
            student stu = list.get(i);
            System.out.println(stu.getName()+","+stu.getAge());
        }
    }
}

2.5 查找用户的索引+查找用户是否存在(结合版)

案例需求:对象信息采用键盘录入 

1,main方法中定义一个集合,存入三个用户对象。

用户属性为:id,username,password

2,要求:定义一个方法,根据id查找对应的学生信息。

如果存在,返回索引

如果不存在,返回-1

注意:用键盘录入创建用户对象并写入数组,将创建对象写在循环内部

import java.util.ArrayList;
import java.util.Scanner;

public class arrayUser {

    public static void main(String[] args) {
        ArrayList<user> list =new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            user u =new user();
            System.out.println("输入用户id:");
            String id = sc.next();
            System.out.println("输入用户名:");
            String username = sc.next();
            System.out.println("输入密码:");
            String password = sc.next();
            u.setId(id);
            u.setUsername(username);
            u.setPassword(password);
            list.add(u);
        }
        int index = findIndex(list, "12");
        System.out.println(index);
        boolean temp = judgement(list, "12");
        System.out.println(temp);

    }
    
    public static boolean judgement(ArrayList<user>list,String id){
        //在方法里面嵌套调用方法,如果索引大于0(用户存在),返回true
        if (findIndex(list,id)>0){
            return true;
        }else {
            return false;
        }
    }
    public static int findIndex(ArrayList<user>list,String id){
        for (int i = 0; i < list.size(); i++) {
            //u=list.get(i),cid = u.getId(),cid.equals(id)
            if (list.get(i).getId().equals(id)){
                return i;
            }
        }
        return -1;
    }
}

2.6 返回多个数据

3.学生信息管理系统

需求:

采取控制台的方式去书写学生管理系统。

分析:

初始菜单:
"-------------欢迎来到黑马学生管理系统----------------"
"1:添加学生"
"2:删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择:"
学生类:

属性:id、姓名、年龄、家庭住址

添加功能:

键盘录入每一个学生信息并添加,需要满足以下要求:

  • id唯一

删除功能:

键盘录入要删除的学生id,需要满足以下要求:

  • id存在删除

  • id不存在,需要提示不存在,并回到初始菜单

修改功能:

键盘录入要修改的学生id,需要满足以下要求

  • id存在,继续录入其他信息

  • id不存在,需要提示不存在,并回到初始菜单

查询功能:

打印所有的学生信息,需要满足以下要求

  • 如果没有学生信息,提示:当前无学生信息,请添加后再查询

  • 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)

id          姓名      年龄      家庭住址
heima001    张三      23       南京
heima002    李四      24       北京
heima003    王五      25       广州
heima004    赵六      26       深圳

分析成图:

示例代码:

测试代码:
import java.util.ArrayList;
import java.util.Scanner;

public class studentSystem {
    public static void main(String[] args) {
        ArrayList<student> list = new ArrayList<>();
        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("请输入您的选择:");
            Scanner sc = new Scanner(System.in);
            String choice = sc.next();
            switch (choice){
                case "1" ->addStudent(list);
                case "2" ->deleteStudent(list);
                case "3" ->updateStudent(list);
                case "4" ->queryStudent(list);
                case "5" ->System.exit(0);
                default -> System.out.println("没有该选项!");
            }
        }
    }
    //增加学生
    public static void addStudent(ArrayList<student> list){
        student stu = new student();
        Scanner sc = new Scanner(System.in);
        System.out.println("输入学生的id:");
        String id = sc.next();
        //第一个数据录入时,list.size()=0,此时并不会执行循环
        for (int i = 0; i < list.size(); ) {
            if (list.get(i).getId().equals(id)){
                System.out.println("id重复,请重新输入");
                id=sc.next();
            }else {
                i++;
            }
        }
        System.out.println("输入学生的姓名:");
        String name = sc.next();
        System.out.println("输入学生的年龄:");
        int age = sc.nextInt();
        System.out.println("输入学生的家庭住址:");
        String address = sc.next();
        stu.setId(id);
        stu.setName(name);
        stu.setAge(age);
        stu.setHomeAddress(address);
        list.add(stu);
    }
//删除学生
    public static void deleteStudent(ArrayList<student> list){
        Scanner sc = new Scanner(System.in);
        System.out.println("输入需要操作的id:");
        String id = sc.next();
        if (getIndex(list,id)>=0){
            list.remove(getIndex(list,id));
            System.out.println("已成功删除id为:"+id+"的学生");
        }else{
            System.out.println("该id不存在,操作失败");
        }
    }
    //修改学生
    public static void updateStudent(ArrayList<student> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入要修改学生的id:");
        String id = sc.next();
        if (getIndex(list,id)>=0){
            int index = getIndex(list, id);
            student stu = list.get(index);
            System.out.println("输入要修改的学生姓名:");
            stu.setName(sc.next());
            System.out.println("输入要修改的学生年龄:");
            stu.setAge(sc.nextInt());
            System.out.println("输入要修改的学生家庭住址:");
            stu.setHomeAddress(sc.next());
            System.out.println("学生信息更新成功!");
        }else {
            System.out.println("该id不存在,操作失败");
        }
    }
    //查询学生
    public static void queryStudent(ArrayList<student> list) {
        if (list.size()==0){
            System.out.println("不存在学生,请添加后查询");
            //这里return表示结束方法
            return;
        }
        System.out.println("id\t\t\t姓名\t\t年龄\t\t家庭住址");
        //当代码执行到这里,表示集合中是有数据的
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getId()+"\t\t"+list.get(i).getName()+"\t\t"+list.get(i).getAge()+"\t\t" +list.get(i).getHomeAddress());
        }
    }
//获取索引
    public static int getIndex(ArrayList<student> list,String id){
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getId().equals(id)){
                return i;
            }
        }
        return -1;
    }
}
学生类定义:
public class student {
    private String id;
    private String name;
    private int age;
    private String homeAddress;

    public student() {
    }

    public student(String id, String name, int age, String homeAddress) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.homeAddress = homeAddress;
    }

    public String getId() {
        return id;
    }

    public void setId(String 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 String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }
}

4.学生管理系统登陆(难度大)

需求:

为学生管理系统书写一个登陆、注册、忘记密码的功能。

只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

分析:

登录界面:
System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作1登录 2注册 3忘记密码");
用户类:

属性:用户名、密码、身份证号码、手机号码

注册功能:

1,用户名需要满足以下要求:

验证要求:

用户名唯一

用户名长度必须在3~15位之间

只能是字母加数字的组合,但是不能是纯数字

2,密码键盘输入两次,两次一致才可以进行注册。

3,身份证号码需要验证。

验证要求:

长度为18位

不能以0为开头

前17位,必须都是数字

最为一位可以是数字,也可以是大写X或小写x

4,手机号验证。

验证要求:

长度为11位

不能以0为开头

必须都是数字

登录功能:

1,键盘录入用户名

2,键盘录入密码

3,键盘录入验证码

验证要求:

用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册

判断验证码是否正确,如不正确,重新输入

再判断用户名和密码是否正确,有3次机会

忘记密码:

1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册

2,键盘录入身份证号码和手机号码

3,判断当前用户的身份证号码和手机号码是否一致,

如果一致,则提示输入密码,进行修改。

如果不一致,则提示:账号信息不匹配,修改失败。

验证码规则:

长度为5

由4位大写或者小写字母和1位数字组成,同一个字母可重复

数字可以出现在任意位置

比如:

aQa1K

代码示例:

用户类定义:
public class users {
    private String name;
    private String password;
    private String id;
    private String phoneNumber;

    public users() {
    }

    public users(String name, String password, String id, String phoneNumber) {
        this.name = name;
        this.password = password;
        this.id = id;
        this.phoneNumber = phoneNumber;
    }

    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 getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
用户类测试:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class studentSystemUP1 {
    public static void main(String[] args) {
        ArrayList<users> list = new ArrayList<>();
        while (true) {
            Scanner sc =new Scanner(System.in);
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作1登录 2注册 3忘记密码");
            String choice = sc.next();
            switch (choice){
                case "1"->signIn(list);
                case "2"->creatUser(list);
                case "3"->forgetPassword(list);
                case "4"->{
                    System.out.println("谢谢使用!再见");
                    System.exit(0);
                }
                default -> System.out.println("没有该选项,请重选");
            }
        }
    }
    //登录
    public static void signIn(ArrayList<users> list){
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name;
        name=sc.next();
        if (!checkNameOnly(list,name)){
            System.out.println("用户名正确");
        }else {
            System.out.println("用户名未注册,请先注册");
            //return表示直接结束方法
            return;
        }
        while (true) {
            String vercode = verCode();
            System.out.println("验证码为:"+vercode);
            System.out.println("请输入验证码:");
            String numberCopy = sc.next();
            if (vercode.equalsIgnoreCase(numberCopy)){
                System.out.println("验证码验证正确,验证通过!");
                break;
            }else {
                System.out.println("验证码验证失败,请重新输入!");
            }
        }
        //判断用户名和密码是否正确,有3次机会
        for (int i=3; i>0;i--) {
            System.out.println("请输入密码:");
            String password = sc.next();
            //封装思想的运用:把零散的数据,封装成一个对象,传递参数时只传递一个
            users stu =new users(name,password,null,null);
            boolean temp = judgeNameCode(list, stu);
            if (temp){
                System.out.println("您已登录成功!");
//------------------------------创建对象调用方法,启动学生管理系统-------------------------------------------------------------
                StudentSystem ss = new StudentSystem();
                //startStudentSystem是学生管理系统中的主文件改的名字
                ss.startStudentSystem();
                break;
            }else {
                System.out.println("用户名或密码错误,请重新登录!剩余"+(i-1)+"次机会");
                if (i==1){
                    System.out.println("输入错误超过3次,系统已经封禁,开启请联系系统开发人员!");
                }
            }
        }
    }
    //注册
    public static void creatUser(ArrayList<users> list){
        Scanner sc =new Scanner(System.in);
        users stu =new users();
        System.out.println("请输入用户名:");
        String name;
        //检验用户名(除唯一性)
        while (true) {
            name = sc.next();
            boolean check = checkName(name);
            if (check){
                System.out.println("用户名符合规范,开始判断唯一性");
                break;
            }else {
                System.out.println("用户名不符合规范,重新输入");
            }
        }
        //检验用户名(唯一性)
        while (true) {
            boolean only = checkNameOnly(list, name);
            if (only){
                System.out.println("用户名唯一,创建成功");
                //将用户名存入对象
                stu.setName(name);
                break;
            }else {
                System.out.println("用户名重复,请重新输入:");
            }
        }
        //校正密码
        while (true) {
            System.out.println("输入密码:");
            String password1 = sc.next();
            System.out.println("输入第二次密码:");
            String password2 = sc.next();
            if (password1.equals(password2)){
                System.out.println("密码两次输入一致,密码创建成功!");
                stu.setPassword(password2);
                break;
            }else {
                System.out.println("密码两次输入不一致,请重新输入");
            }
        }
        //验证身份证号码
        while (true) {
            System.out.println("开启实名认证,请输入您的身份证号:");
            String id = sc.next();
            boolean personId = checkId(id);
            if (personId){
                System.out.println("身份信息验证通过!");
                stu.setId(id);
                break;
            }else {
                System.out.println("身份信息有误!请重新输入");
            }
        }
        //4,手机号验证
        while (true) {
            System.out.println("请输入手机号");
            String phoneNumber = sc.next();
            if (checkNumber(phoneNumber)){
                stu.setPhoneNumber(phoneNumber);
                System.out.println("手机号已成功录入系统!");
                break;
            }else {
                System.out.println("手机号格式有误,请重新输入");
            }
        }
        //加入集合中
        list.add(stu);

    }
    //忘记密码
    public static void forgetPassword(ArrayList<users> list){
        //1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册
        Scanner sc =new Scanner(System.in);
        System.out.println("输入用户名:");
        String name = sc.next();
        boolean exist = checkNameOnly(list, name);
        if(!exist){
            System.out.println("用户名存在");
        }else {
            System.out.println("未注册,请先进行注册!");
            return;
        }
        //2,键盘录入身份证号码和手机号码
        //3,判断当前用户的身份证号码和手机号码是否一致,
        //  如果一致,则提示输入密码,进行修改。
         // 如果不一致,则提示:账号信息不匹配,修改失败。
        while (true) {
            System.out.println("请输入您的身份证号:");
            String id = sc.next();
            System.out.println("请输入您的手机号:");
            String phoneNumber = sc.next();
            //封装思想
            users stu =new users(name,null,id,phoneNumber);
            boolean temp = judgeIdPhone(list, stu);
            if (temp){
                System.out.println("用户名"+name+"的身份证号码和手机号码一致,可进行重置密码");
                break;
            }else {
                System.out.println("用户名"+name+"的账号信息不匹配,修改失败,请检查重试");
            }
        }
        //两次输入重置密码
        while (true) {
            System.out.println("输入重置后的密码:");
            String newPass = sc.next();
            System.out.println("再次输入重置后的密码:");
            String newPass2 = sc.next();
            if (newPass.equals(newPass2)){
                int nameIndex = getNameIndex(list, name);
                list.get(nameIndex).setPassword(newPass);
                System.out.println("密码修改成功!");
                break;
            }else {
                System.out.println("两次密码输入不一致,重新输入");
            }
        }

    }


    //-------------------------以下为封装的方法-----------------------------------------------


    //检验用户名(除唯一性)
    public static boolean checkName(String name){
        //用户名长度必须在3~15位之间,不满足直接false
        if (name.length()<3||name.length()>15){
            return false;
        }
        //只能是字母加数字的组合,如果有其他直接false
        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            if (!((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9'))){
                return false;
            }
        }
        //不能是纯数字,如果有字母,让count++,返回count>0,若有字母则return true
        int count=0;
        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
                count++;
                //有一个满足就跳出
                break;
            }
        }
        return count>0;
    }
    //检验用户名(唯一性),重复返回false
    public static boolean checkNameOnly(ArrayList<users> list, String name){
        for (int i = 0; i < list.size(); i++) {
            users stu = list.get(i);
            if (stu.getName().equals(name)){
                return false;
            }
        }
        return true;
    }
    //检验用户名(唯一性),重复返回i
    public static int getNameIndex(ArrayList<users> list, String name){
        for (int i = 0; i < list.size(); i++) {
            users stu = list.get(i);
            if (stu.getName().equals(name)){
                return i;
            }
        }
        return -1;
    }
    //验证身份证号码
    public static boolean checkId(String id){
        //1.长度为18位
        if (id.length()!=18){
            return false;
        }
        //2.不能以0为开头
        if (id.startsWith("0")){
            return false;
        }
        //3.前17位,必须都是数字
        for (int i = 0; i < id.length()-1; i++) {
            char c = id.charAt(i);
            if (!(c>='0'&&c<='9')){
                return false;
            }
        }
        //4.最为一位可以是数字,也可以是大写X或小写x
        char c = id.charAt(id.length() - 1);
        if ((c>='0'&&c<='9')||c=='x'||c=='X'){
            return true;
        }
    return false;
    }
    //验证手机号
    public static boolean checkNumber(String number){
        //1.长度为11位
        if (number.length()!=11){
            System.out.println("号码长度不为11位");
            return false;
        }
        //2.不能以0为开头
        if (number.startsWith("0")){
            System.out.println("号码以0为开头");
            return false;
        }
        //3.必须都是数字
        for (int i = 0; i < number.length(); i++) {
            char c = number.charAt(i);
            if (!(c>='0'&&c<='9')){
                System.out.println("号码中存在非数字");
                return false;
            }
        }
        return true;
    }
    //构建验证码
    public static String verCode(){
        char []arr = new char[52];
        for (int i = 0; i < arr.length; i++) {
            if(i<26){
                arr[i]=(char) (97+i);
            }
            if(i>=26){
                arr[i]=(char) (65+i-26);
            }
        }
        Random sc = new Random();
        StringBuilder sb =new StringBuilder();
        for (int i = 0; i < 5; i++) {
            int index = sc.nextInt(53);
            sb=sb.append(arr[index]);
        }
        int randomIndex = sc.nextInt(5);
        int number = sc.nextInt(10);
        String str = sb.toString();
        char[] chars = str.toCharArray();
        chars[randomIndex]=(char) (48+number);
        String newString = new String(chars);
        return newString;
    }
      //判断用户名和密码是否正确
    public static boolean judgeNameCode(ArrayList<users> list, users stu){
        for (int i = 0; i < list.size(); i++) {
            users user = list.get(i);
            if (user.getName().equals(stu.getName())&&user.getPassword().equals(stu.getPassword())){
                return true;
            }
        }
        return false;
    }
    //判断当前用户的身份证号码和手机号码是否一致
    public static boolean judgeIdPhone(ArrayList<users> list, users stu){
        for (int i = 0; i < list.size(); i++) {
            users s = list.get(i);
            if (s.getName().equals(stu.getName())&&s.getId().equals(stu.getId())&&s.getPhoneNumber().equals(stu.getPhoneNumber())){
                return true;
            }
        }
        return false;
    }
}

代码总结:

1. string的方法:String.startsWith("0"),0可以替换为任何字符,该方法表示检查该字符是不是以指定字符串开头的,如果是返回true。
2.return除了表示返回某个数值,也表示直接结束该方法
3. 在这里用到了多次,“不符合要求重新输入”,这里需要用while/for将其包围,结合continue(最后一行的话可以省略)。
4.封装思想的运用:在对比多个零散数据时,创立一个对象进行传递,这种封装经常使用

5.调用学生管理系统
将之前写好的学生管理系统改名,将小括号内容清空:

先登录后调用,在登陆成功处,将学生管理系统调用进来,先创建对象,方法与调用类方法相同:

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值