ArrayList集合

Java学习笔记(新手纯小白向)

第一章 JAVA基础概念

第二章 JAVA安装和环境配置

第三章 IntelliJ IDEA安装

第四章 运算符

第五章 运算符联系

第六章 判断与循环

第七章 判断与循环练习

第八章 循环高级综合

第九章 数组介绍及其内存图

第十章 数组基础练习

第十一章 方法基础及简单应用

第十二章 方法基础练习

第十三章 前续知识综合练习

第十四章 面向对象基础

第十五章 面向对象综合训练

第十六章 字符串基础

第十七章 字符串基础练习

第十八章 ArrayList集合

第十九章 ArrayList集合基础练习


目录

Java学习笔记(新手纯小白向)

前言

一、ArrayList集合

        1.集合与数组的对比

                1、长度

                2、存储类型

        2.创建集合的对象

                1、泛型

                2、ArrayList成员方法

                3、基本数据类型对应的包装类 

                4、集合遍历

                5、代码演示 

        3.练习

                1、添加用户对象并判断是否存在

                2、手机信息

二、学生管理系统

        1.需求

        2.分析

        3. 业务结构分析

        4.参考代码

 三、升级版学生管理系统

        1.需求

        2.分析

        3.业务总体结构分析

        4.注册业务分析

        5.登录业务分析

        6.修改密码业务分析

        7.参考代码

总结


前言

本篇章主要介绍了ArrayList集合的一些基础概念及其使用方法与场景,并且编写了一个比较综合的学生管理系统,能对所学知识进行串联。


一、ArrayList集合

        1.集合与数组的对比

                1、长度

                        数组长度固定,集合长度可变

                2、存储类型

                         数组可以存基本数据类型和引用数据类型;集合可以存引用数据类型,若要存基本数据类型,需要包装类

        2.创建集合的对象

                1、泛型

                        限定集合中存储数据的类型

ArrayList<String> list = new ArrayList<String>();

                        此时我们创建的是ArrayList的对象,而ArrayList是Java已经写好的一个类。这个类在底层做了一些处理,打印对象不是地址值,而是集合中存储数据内容,在展示的时候会拿[ ]把多有的数据进行包裹。

                2、ArrayList成员方法

增    boolean add(E e)       添加元素,返回值表示是否添加成功
删    boolean remove(E e)    删除指定元素,返回值表示是否删除成功
      E remove(int index)    删除指定索引的元素,返回被删除的元素
改    E set(int index,E e)   修改指定索引下的元素,返回原来的元素
查    E get(int index)       获取指定索引的元素
      int size()              获取集合的长度,也就是集合中元素的个数
    //增    boolean add(E e)       添加元素,返回值表示是否添加成功

    //删    boolean remove(E e)    删除指定元素,返回值表示是否删除成功
    //      E remove(int index)    删除指定索引的元素,返回被删除的元素

    //改    E set(int index,E e)   修改指定索引下的元素,返回原来的元素

    //查    E get(int index)       获取指定索引的元素

    //      int size()              获取集合的长度,也就是集合中元素的个数
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> list = new ArrayList<String>();

        //添加元素
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        //删除元素
        boolean result = list.remove("ddd");
        String str = list.remove(0);

        //修改元素
        String ddd = list.set(0, "ddd");

        //查询元素
        String s = list.get(0);

        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            String string = list.get(i);
            System.out.println(string);
        }

        System.out.println(s);
        System.out.println(ddd);
        System.out.println(str);
        System.out.println(result);
        System.out.println(list);
    }

                3、基本数据类型对应的包装类 

                        1、byte\rightarrowByte

                        2、short\rightarrowShort

                        3、char\rightarrowCharacter

                        4、int\rightarrowInteger

                        5、long\rightarrowLong

                        6、float\rightarrowFloat

                        7、double\rightarrowDouble

                        8、boolean\rightarrowBoolean

                4、集合遍历

    //定义一个集合,添加字符串,并进行遍历
    //遍历格式参照:[元素1,元素2,元素3]
    public static void main(String[] args) {
        //定义集合
        ArrayList<String> list = new ArrayList<>();

        //添加元素
        list.add("我是谁?");
        list.add("我从哪里来?");
        list.add("我要到哪里去?");

        //遍历集合
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            if (i != list.size() - 1) {
                System.out.print(list.get(i) + ",");
            } else {
                System.out.print(list.get(i));
            }
        }
        System.out.println("]");
    }
    //定义一个集合,添加数字,并进行遍历
    //遍历格式参照:[元素1,元素2,元素3]
    public static void main(String[] args) {
        //定义集合
        ArrayList<Integer> list = new ArrayList<>();

        //添加数字
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        //遍历集合
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            if (i != list.size() - 1) {
                System.out.print(list.get(i) + ",");
            } else {
                System.out.print(list.get(i));
            }
        }
        System.out.println("]");
    }

                5、代码演示 

                        (1)遍历学生对象1.0

public class Student {
    //定义成员变量
    private String name;
    private int age;

    //定义空参构造和带参构造
    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //定义成员变量的get和set方法
    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 class StudentTest {
    //添加学生对象,并遍历
    //定义一个集合,添加一些学生对象,并进行遍历
    //学生类的属性为:姓名、年龄
    public static void main(String[] args) {
        //创建学生对象
        Student stu1 = new Student("刘备", 20);
        Student stu2 = new Student("关羽", 19);
        Student stu3 = new Student("张飞", 18);

        //定义集合
        ArrayList<Student> students = new ArrayList<>();

        //添加学生对象
        students.add(stu1);
        students.add(stu2);
        students.add(stu3);

        //遍历集合
        for (int i = 0; i < students.size(); i++) {
            System.out.print(students.get(i).getName());
            System.out.println(students.get(i).getAge());
        }
    }
}

                         (2)遍历学生对象2.0

public class Student {
    //定义成员变量
    private String name;
    private int age;

    //定义空参构造和带参构造
    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //定义成员变量的get和set方法
    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 class StudentTest {
    //添加学生对象,并遍历
    //定义一个集合,添加一些学生对象,并进行遍历
    //学生类的属性为:姓名、年龄
    //对象的数据来自键盘录入
    public static void main(String[] args) {
        //定义集合
        ArrayList<Student> students = new ArrayList<>();

        //创建学生对象,键盘录入学生对象的数据
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            //键盘录入信息
            System.out.print("请输入第" + (i + 1) + "位学生的姓名:");
            String name = sc.next();
            System.out.print("请输入第" + (i + 1) + "位学生的年龄:");
            int age = sc.nextInt();

            //创建学生对象
            Student student = new Student();

            //设置学生信息
            student.setName(name);
            student.setAge(age);

            //添加学生对象进入数组
            students.add(student);
        }

        //遍历集合
        for (int i = 0; i < students.size(); i++) {
            System.out.print(students.get(i).getName());
            System.out.println(students.get(i).getAge());
        }
    }
}

        3.练习

                1、添加用户对象并判断是否存在

                        (1)需求:main方法中定义一个集合,存入三个用户对象。用户属性为:id,username,password 定义一个方法,根据id查找对应的用户信息。如果存在,返回true;如果不存在,返回false。

                        (2)参考答案

public class User {
    //定义成员变量
    private String id;
    private String username;
    private String password;

    //定义空参构造和带参构造
    public User() {
    }

    public User(String id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    //定义成员变量的get和set方法
    public String getId() {
        return id;
    }

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

    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;
    }

    //定义成员方法,根据id判断用户是否存在
    //形参idString为要判断的用户id
    public boolean judge(String idString) {
        if (idString.equals(this.id)) {
            return true;
        } else {
            return false;
        }
    }
}
public class UserTest {
    //添加用户对象并判断是否存在
    //main方法中定义一个集合,存入三个用户对象
    //用户属性为:id,username,password
    //定义一个方法,根据id查找对应的用户信息
    //如果存在,返回true;如果不存在,返回false
    public static void main(String[] args) {
        //定义用户对象集合
        ArrayList<User> users = new ArrayList<>();

        //添加用户对象
        users.add(new User("lb001", "刘备", "lb100"));
        users.add(new User("gy002", "关羽", "gy200"));
        users.add(new User("zf003", "张飞", "zf300"));

        //键盘录入要查询的id
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您要查找的用户id:");
        String id = sc.next();

        //调用方法getUserInfo,打印结果
        System.out.println("该用户是否存在:" + getUserInfo(users, id));
    }

    //定义方法getUserInfo,根据id查找对应的用户信息
    public static boolean getUserInfo(ArrayList<User> cobber, String id) {
        //定义变量flag,记录判断结果,默认存在
        boolean flag = true;
        for (int i = 0; i < cobber.size(); i++) {
            //调用成员方法judge,判断用户是否存在
            flag = cobber.get(i).judge(id);
            if (flag) {
                System.out.println("用户id为:" + cobber.get(i).getId());
                System.out.println("用户名为:" + cobber.get(i).getUsername());
                System.out.println("用户密码为:" + cobber.get(i).getPassword());
                break;
            }
        }
        if (!flag) {
            System.out.println("该用户不存在!!!");
        }
        return flag;
    }
}

                2、手机信息

                        (1)需求:定义JavaBean类:Phone。 Phone属性:品牌、价格。 main方法中定义一个集合,存入三个手机对象。 分别为:小米,1000;苹果,8000;锤子,2999。 定义一个方法,将价格低于3000的手机信息返回。

                        (2)参考答案

public class Phone {
    //定义成员变量
    private String brand;
    private int price;

    //定义空参构造和带参构造
    public Phone() {
    }
    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
    }

    //定义成员变量的get和set方法

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}
public class PhoneTest {
    //定义JavaBean类:Phone
    //Phone属性:品牌、价格
    //main方法中定义一个集合,存入三个手机对象
    //分别为:小米,1000;苹果,8000;锤子,2999
    //定义一个方法,将价格低于3000的手机信息返回
    public static void main(String[] args) {
        //定义集合phones,存储手机对象
        ArrayList<Phone> phones = new ArrayList<>();

        //创建手机对象,存入集合
        phones.add(new Phone("小米", 1000));
        phones.add(new Phone("苹果", 8000));
        phones.add(new Phone("锤子", 2999));

        //调用方法getInfo,将价格低于3000的手机信息返回
        ArrayList<Phone> phoneList = getInfo(phones, 3000);
        for (int i = 0; i < phoneList.size(); i++) {
            System.out.println("手机品牌:" + phoneList.get(i).getBrand());
            System.out.println("手机价格:" + phoneList.get(i).getPrice());
            System.out.println("————————————");
        }
    }

    //定义方法judge,对输入价格做判断
    public static int judge(int pricelim) {
        //键盘录入指定价格
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入价格上限:");
            pricelim = sc.nextInt();
            if (pricelim < 0) {
                System.out.println("违规输入,请重新输入!!!");
            } else {
                break;
            }
        }
        return pricelim;
    }

    //定义方法getInfo,获取低于指定价格的手机信息
    public static ArrayList<Phone> getInfo(ArrayList<Phone> phone, int price) {
        //调用方法judge,对价格进行判断
        price = judge(price);
        //定义集合result,存储符合要求的手机对象
        ArrayList<Phone> result = new ArrayList<>();
        //遍历集合
        //定义变量count,记录符合要求的手机个数
        int count = 0;
        for (int i = 0; i < phone.size(); i++) {
            if (phone.get(i).getPrice() < price) {
                result.add(phone.get(i));
                count++;
            }
        }
        if (count == 0) {
            System.out.println("暂无符合要求的手机");
        }
        return result;
    }
}

二、学生管理系统

        1.需求

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

        2.分析

                1、初始菜单:

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

                2、学生类:

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

                3、添加功能:

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

                4、删除功能:

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

                        (1)id存在删除

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

                5、修改功能:

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

                        (1)id存在,继续录入其他信息

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

                6、查询功能:

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

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

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

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

        3. 业务结构分析

        4.参考代码

public class Student {
    //定义学生的属性
    private String id;
    private String name;
    private int age;
    private String address;

    //定义空参构造和带参构造
    public Student() {
    }

    public Student(String id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    //定义所有成员变量的get和set方法
    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 getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    //定义方法existence,判断id是否存在
    public int existence(ArrayList<Student> studentArrayList, String id) {
        //遍历集合,判断是否存在
        for (int i = 0; i < studentArrayList.size(); i++) {
            if (id.equals(studentArrayList.get(i).id)) {
                return i;
            }
        }
        return -1;
    }
}
public class StudentManagement {
    public static void main(String[] args) {
        //键盘录入功能
        Scanner sc = new Scanner(System.in);

        //定义集合,存储学生对象
        ArrayList<Student> students = new ArrayList<>();

        //定义变量flag,记录id是否存在(存在返回其索引,不存在返回-1)
        int flag = 0;

        loop:
        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.print("请输入您的选择:");
            String code = sc.next();

            //创建学生对象
            Student student = new Student();

            //根据输入,执行不同的功能
            switch (code) {
                case "1" -> addStu(students, flag, student, sc);
                case "2" -> removeStu(students, flag, student, sc);
                case "3" -> modifyStu(students, flag, student, sc);
                case "4" -> getStu(students);
                case "5" -> {
                    break loop;
                }
                default -> System.out.println("没有此选项!!!");
            }
        }
    }

    //定义方法addStu,添加学生
    public static void addStu(ArrayList<Student> students, int flag, Student student, Scanner sc) {
        System.out.print("请输入学生的id:");
        String id = sc.next();

        //调用方法existence,判断id是否唯一
        flag = student.existence(students, id);

        //若唯一,则添加;若不唯一,则提示,并回到初始菜单
        if (flag == -1) {
            System.out.print("请输入学生的姓名:");
            String name = sc.next();
            System.out.print("请输入学生的年龄:");
            int age = sc.nextInt();
            System.out.print("请输入学生的家庭住址:");
            String address = sc.next();

            //添加学生信息
            student.setId(id);
            student.setName(name);
            student.setAge(age);
            student.setAddress(address);
            students.add(student);
            System.out.println("添加成功!!!");
        } else {
            System.out.println("已存在该学生id!!!");
            System.out.println("————————————————");
        }
    }

    //定义方法removeStu,删除学生
    public static void removeStu(ArrayList<Student> students, int flag, Student student, Scanner sc) {
        System.out.print("请输入学生的id:");
        String id = sc.next();

        //调用方法existence,判断id是否存在
        flag = student.existence(students, id);

        //若存在,则删除;若不存在,则提示,并回到初始菜单
        if (flag != -1) {
            students.remove(flag);
            System.out.println("删除成功!!!");
        } else {
            System.out.println("不存在该学生id!!!");
            System.out.println("————————————————");
        }
    }

    //定义方法modifyStu,修改学生信息
    public static void modifyStu(ArrayList<Student> students, int flag, Student student, Scanner sc) {
        System.out.print("请输入学生的id:");
        String id = sc.next();

        //调用方法existence,判断id是否存在
        flag = student.existence(students, id);

        //若存在,则继续录入其他信息;若不存在,则提示,并回到初始菜单
        if (flag != -1) {
            System.out.print("请输入学生的姓名:");
            String name = sc.next();
            System.out.print("请输入学生的年龄:");
            int age = sc.nextInt();
            System.out.print("请输入学生的家庭住址:");
            String address = sc.next();

            //修改学生信息
            student.setId(id);
            student.setName(name);
            student.setAge(age);
            student.setAddress(address);
            students.set(flag, student);
        } else {
            System.out.println("不存在该学生id!!!");
            System.out.println("————————————————");
        }
    }

    //定义方法getStu,查询学生信息
    public static void getStu(ArrayList<Student> students) {
        //如果没有学生信息,则提示;如果有学生信息,则输出
        if (students.size() == 0) {
            System.out.println("当前无学生信息,请添加后再查询");
        } else {
            System.out.println("id\t\t\t姓名\t\t年龄\t\t家庭住址");
            for (int i = 0; i < students.size(); i++) {
                System.out.println(students.get(i).getId() + "  " + students.get(i).getName() + "  "
                        + students.get(i).getAge() + "      " + students.get(i).getAddress());
            }
        }
    }
}

 三、升级版学生管理系统

        1.需求

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

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

        2.分析

                1、登录界面:

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

                2、用户类:

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

                 3、注册功能:

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

                        验证要求:用户名唯一;用户名长度必须在3~15位之间;只能是字母加数字的组合,但是不能是纯数字。

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

                (3)身份证号码需要验证。

                        验证要求:长度为18位;不能以0为开头;前17位,必须都是数字;最后一位可以是数字,也可以是大写X或小写x

                (4)手机号验证。

                        验证要求:长度为11位;不能以0为开头;必须都是数字

                4、登录功能:

                (1)键盘录入用户名

                (2)键盘录入密码

                (3)键盘录入验证码

                (4)验证要求:用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册;判断验证码是否正确,如不正确,重新输入;再判断用户名和密码是否正确,有3次机会

                5、忘记密码:

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

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

                (3)判断当前用户的身份证号码和手机号码是否一致,如果一致,则提示输入密码,进行修改。如果不一致,则提示:账号信息不匹配,修改失败。

                6、验证码规则:长度为5;由4位大写或者小写字母和1位数字组成,同一个字母可重复;数字可以出现在任意位置,比如:aQa1K

        3.业务总体结构分析

        4.注册业务分析

        5.登录业务分析

        6.修改密码业务分析

        7.参考代码

public class User {
    //定义用户的属性
    private String username;
    private String password;
    private String idNumber;
    private String phoneNum;

    //定义空参构造和带参构造
    public User() {
    }
    public User(String username, String password, String idNumber, String phoneNum) {
        this.username = username;
        this.password = password;
        this.idNumber = idNumber;
        this.phoneNum = phoneNum;
    }

    //定义成员变量的get和set方法
    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 String getIdNumber() {
        return idNumber;
    }

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
}
public class UserLogin {
    public static void main(String[] args) {
        //键盘录入功能0
        Scanner sc = new Scanner(System.in);

        //定义集合users,存储已经注册的用户
        ArrayList<User> users = new ArrayList<>();

        //登录界面
        loop:
        while (true) {
            System.out.println("————————————————");
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作1登录 2注册 3忘记密码 4退出");
            System.out.println("请输入您的选择:");
            String code = sc.next();

            //根据不同的选项,进入不同的功能
            switch (code) {
                case "1" -> {
                    if (Login(users, sc)) {
                        break loop;
                    }
                }
                case "2" -> register(users, sc);
                case "3" -> forgetPass(users, sc);
                case "4" -> {
                    System.out.println("谢谢使用,再见");
                    System.exit(0);
                }
                case "5" -> getUserInfo(users);
                default -> System.out.println("没有此选项!!!");
            }
        }
    }

    //定义方法getUserInfo,获取所有用户的信息
    public static void getUserInfo(ArrayList<User> users) {
        System.out.println("用户名\t\t密码\t\t身份证号\t\t手机号");
        for (int i = 0; i < users.size(); i++) {
            System.out.println(users.get(i).getUsername() + "\t\t" + users.get(i).getPassword() + "\t\t" +
                    users.get(i).getIdNumber() + "\t\t" + users.get(i).getPhoneNum());
        }
    }

    //判断用户是否注册,即是否存在,若存在,返回其索引
    public static int exist(ArrayList<User> users, String username) {
        for (int i = 0; i < users.size(); i++) {
            if (username.equals(users.get(i).getUsername())) {
                return i;
            }
        }
        return -1;
    }

    //生成验证码功能
    public static String getVerifyCode() {
        //生成随机数功能
        Random r = new Random();

        //定义集合letter,存储大写字母和小写字母
        ArrayList<Character> letter = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            letter.add((char) (i + 65));
            letter.add((char) (i + 97));
        }

        //创建StringBuilder对象verifyCode,用于存储验证码
        StringBuilder verifyCode = new StringBuilder();

        //生成随机索引,获取4位大写或者小写字母,同一个字母可重复
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(letter.size());
            verifyCode.append(letter.get(index));
        }

        //生成随机数,加入字符串容器
        verifyCode.append(r.nextInt(10));

        //将字符串容器转为字符数组
        char[] verifyCodeArr = verifyCode.toString().toCharArray();

        //将容器中的数据顺序打乱
        //定义变量index,记录随机索引
        int index = r.nextInt(verifyCodeArr.length);
        //定义中间变量temp,记录最后一位数字
        char temp = verifyCodeArr[verifyCodeArr.length - 1];
        verifyCodeArr[verifyCodeArr.length - 1] = verifyCodeArr[index];
        verifyCodeArr[index] = temp;

        //将数组中的数据拼接为字符串,并返回
        return new String(verifyCodeArr);
    }

    //登录功能
    public static boolean Login(ArrayList<User> users, Scanner sc) {
        //定义变量flag,记录是否登录成功,默认不成功
        boolean flag = false;

        loop:
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名:");
            String username = sc.next();
            System.out.println("请输入密码:");
            String password = sc.next();

            //调用方法exist,判断用户名是否注册,并记录其索引index
            int index = exist(users, username);
            if (index != -1) {
                while (true) {
                    //调用方法getVerifyCode,生成随机验证码verifyCodeR
                    String verifyCodeR = getVerifyCode();
                    System.out.println("验证码为:" + verifyCodeR);
                    System.out.println("请输入验证码:");
                    String verifyCode = sc.next();

                    //判断验证码是否正确,忽略大小写
                    if (verifyCode.equalsIgnoreCase(verifyCodeR)) {
                        //判断用户名和密码是否正确
                        if (username.equals(users.get(index).getUsername()) && password.equals(users.get(index).getPassword())) {
                            flag = true;
                            System.out.println("登录成功!!!");
                            break loop;
                        } else {
                            if (i == 2) {
                                System.out.println("当前账号已被锁定,请联系管理员!!!");
                                break loop;
                            } else {
                                System.out.println("用户名或密码错误,请重新输入!!!");
                                System.out.println("您还有" + (2 - i) + "次机会");
                                break;
                            }
                        }
                    } else {
                        System.out.println("验证码错误!!!");
                    }
                }
            } else {
                System.out.println("用户名未注册,请先注册");
            }
        }
        return flag;
    }

    //注册功能
    public static void register(ArrayList<User> users, Scanner sc) {
        //创建用户对象user
        User user = new User();

        //验证用户名
        while (true) {
            System.out.println("用户名长度,必须在3~15位之间");
            System.out.println("用户名只能是字母加数字的组合,但不能是纯数字");
            System.out.println("请输入用户名:");
            String username = sc.next();

            //定义变量userFlag,记录用户名输入是否正确,默认正确
            boolean nameFlag = true;

            //调用方法exist,验证用户名是否唯一,并记录其索引index
            int index = exist(users, username);
            if (index == -1) {
                //验证用户名长度,必须在3~15位之间
                if (username.length() >= 3 && username.length() <= 15) {
                    //验证用户名格式,只能是字母加数字的组合,但不能是纯数字
                    //定义变量numDigit,记录用户名中数字的个数
                    int numDigit = 0;
                    for (int i = 0; i < username.length(); i++) {
                        //定义变量c,记录用户名的每一个字符
                        char c = username.charAt(i);
                        //判断是否是纯数字
                        if (c >= 48 && c <= 57) {
                            numDigit++;
                        } else if (c < 65 || (c > 90 && c < 97) || c > 122) {
                            //判断是否是字母加数字的组合
                            nameFlag = false;
                            System.out.println("用户名格式错误,请重新输入!!!");
                            break;
                        }
                    }
                    if (numDigit == username.length()) {
                        nameFlag = false;
                        System.out.println("用户名格式错误,请重新输入!!!");
                    }
                    //验证用户名输入正确,将其赋值给user对象
                    if (nameFlag) {
                        user.setUsername(username);
                        break;
                    }
                } else {
                    System.out.println("用户名长度错误,请重新输入!!!");
                }
            } else {
                System.out.println("该用户名已存在!!!");
            }
        }

        //验证密码
        while (true) {
            System.out.println("请输入您的密码:");
            String password1 = sc.next();
            System.out.println("请再次输入您的密码:");
            String password2 = sc.next();

            //两次密码一致才可以进行注册
            if (password1.equals(password2)) {
                user.setPassword(password2);
                break;
            } else {
                System.out.println("两次密码输入不一致,请重新输入!!!");
            }
        }

        //验证身份证号码
        while (true) {
            System.out.println("请输入您的身份证号码:");
            String idNumber = sc.next();

            //定义变量idFlag,记录身份证号码输入是否正确,默认正确
            boolean idFlag = true;

            //验证身份证号码长度,长度为18位
            if (idNumber.length() == 18) {
                //验证身份证号码是否以0为开头
                if (idNumber.charAt(0) != '0') {
                    //验证身份证号码前17位是否都为数字
                    for (int i = 0; i < idNumber.length() - 1; i++) {
                        if (idNumber.charAt(i) < 48 || idNumber.charAt(i) > 57) {
                            idFlag = false;
                            System.out.println("身份证号码输入有误,请重新输入!!!");
                            break;
                        }
                    }
                    //验证最后一位可以是数字,也可以是大写X或小写x
                    if (idFlag) {
                        //定义变量lastId,记录身份证号码最后一位
                        char lastId = idNumber.charAt(idNumber.length() - 1);
                        if ((lastId >= 48 && lastId <= 57) || lastId == 88 || lastId == 120) {
                            user.setIdNumber(idNumber);
                            break;
                        } else {
                            System.out.println("身份证号码输入有误,请重新输入!!!");
                        }
                    }
                } else {
                    System.out.println("身份证号码输入有误,请重新输入!!!");
                }
            } else {
                System.out.println("身份证号码输入有误,请重新输入!!!");
            }
        }

        //验证手机号
        while (true) {
            System.out.println("请输入您的手机号码:");
            String phoneNum = sc.next();

            //定义变量phoneFlag,记录身份证号码输入是否正确,默认正确
            boolean phoneFlag = true;

            //验证手机号长度,长度为11位
            if (phoneNum.length() == 11) {
                //验证手机号是否以0为开头
                if (phoneNum.charAt(0) != '0') {
                    //验证手机号是否都为数字
                    for (int i = 0; i < phoneNum.length(); i++) {
                        if (phoneNum.charAt(i) < 48 || phoneNum.charAt(i) > 57) {
                            phoneFlag = false;
                            System.out.println("手机号码输入有误,请重新输入!!!");
                            break;
                        }
                    }
                    //验证用户名输入正确,将其赋值给user对象
                    if (phoneFlag) {
                        user.setPhoneNum(phoneNum);
                        //将新注册的用户加入用户集合
                        users.add(user);
                        break;
                    }
                } else {
                    System.out.println("手机号码输入有误,请重新输入!!!");
                }
            } else {
                System.out.println("手机号码输入有误,请重新输入!!!");
            }
        }
    }

    //忘记密码功能
    public static void forgetPass(ArrayList<User> users, Scanner sc) {
        System.out.println("请输入用户名:");
        String username = sc.next();

        //调用方法exist,判断当前用户名是否存在,如不存在,直接结束方法,并提示;存在记录其索引index
        int index = exist(users, username);
        if (index != -1) {
            System.out.println("请输入身份证号:");
            String idNumber = sc.next();
            System.out.println("请输入手机号:");
            String phoneNum = sc.next();

            //判断当前用户的身份证号码和手机号码是否一致
            if ((users.get(index).getIdNumber().equalsIgnoreCase(idNumber)) && (users.get(index).getPhoneNum().equals(phoneNum))) {
                //如果一致,则提示输入密码,进行修改
                while (true) {
                    System.out.println("请输入您的新密码:");
                    String password1 = sc.next();
                    System.out.println("请再次输入您的新密码:");
                    String password2 = sc.next();
                    if (password1.equals(password2)) {
                        users.get(index).setPassword(password2);
                        System.out.println("密码修改成功!!!");
                        break;
                    } else {
                        System.out.println("两次密码输入不一致,请重新输入!!!");
                    }
                }
            } else {
                // 如果不一致,则提示
                System.out.println("账号信息不匹配,修改失败!!!");
            }
        } else {
            System.out.println("用户未注册!!!");
        }
    }
}

总结

在了解了集合的基础知识后,一定要自己独立动手练习代码,为以后的进阶打好基础。一定要经常练习,只学习理论是远远不够的。这一节中的学生管理系统与升级版可以自己独立编写一下,借以巩固之前所学的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/684437.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx动静分离和反向代理

一、动静分离 动静分离指的是将动态内容和静态内容分开处理。动态内容通常由后端应用程序生成&#xff0c;例如PHP、Python或Node.js&#xff0c;静态内容则包括图片、CSS、JavaScript等文件。 例子&#xff1a; #代理服务器一 server{listen 80;server_name www.dj.com;r…

Qt如何让按钮的菜单出现在按钮的右侧

直接上代码&#xff0c;我们用到了一个eventfilter的函数功能。这个函数比较厉害和重要&#xff0c;大家务必经常拿出来看看。 void MainWindow::initMenu() { QMenu* menuLiXiang new QMenu; QAction* actXiangMuZhangCheng new QAction("项目章程"); …

BERT+PET方式模型训练

基于BERTPET方式文本分类模型搭建 模型搭建 本项目中完成BERTPET模型搭建、训练及应用的步骤如下&#xff08;注意&#xff1a;因为本项目中使用的是BERT预训练模型&#xff0c;所以直接加载即可&#xff0c;无需重复搭建模型架构&#xff09;: 一、实现模型工具类函数二、实现…

QT获取最小化,最大化,关闭窗口事件

QT获取最小化&#xff0c;最大化&#xff0c;关闭窗口事件 主程序头文件&#xff1a; 实现&#xff1a; changeEvent&#xff0c;状态改变事件 closeEvent触发点击窗口关闭按钮事件 其代码它参考&#xff1a; /*重写该函数*/ void MainWindow::changeEvent(QEvent *event) {…

python 字符串(str)、列表(list)、元组(tuple)、字典(dict)

学习目标: 1:能够知道如何定义一个字符串; [重点] 使用双引号引起来: 变量名 "xxxx" 2:能够知道切片的语法格式; [重点] [起始: 结束] 3:掌握如何定义一个列表; [重点] 使用[ ]引起来: 变量名 [xx,xx,...] 4:能够说出4个列表相关的方法; [了解] ap…

kafka学习笔记 @by_TWJ

目录 1. 消息重复消费怎么解决1.1. 确保相同的消息不会被重复发送(消费幂等性)1.2. 消息去重1.3. 消息重试机制1.4. kafka怎么保证消息的顺序性1.4.1. 利用分区的特征&#xff1a;1.4.2. 解决办法&#xff1a;1.4.3. 分区分配策略1.4.3.1. RangeAssignor &#xff08;每组(Topi…

水电表自动抄表系统

1.简述 水电表自动抄表系统是一种现代化智能化管理系统&#xff0c;它利用先进的物联网&#xff0c;完成了远程控制、即时、零接触的水电表读值收集&#xff0c;大大提升了公共事业服务项目的效率和准确性。该系统不仅减少了人工抄表工作量&#xff0c;还避免了人为失误&#…

Mac环境下,简单反编译APK

一、下载jadx包 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载里面的这个&#xff1a;下载后&#xff0c;找个干净的目录解压&#xff0c;我是放在Downloads下面 二、安装及启动 下载和解压 jadx&#xff1a; 下载 jadx-1.4.7.zip 压缩包。将其解压到你希望的目…

Flink的简单学习四

一 有状态计算 1.1 概念 1.状态;上一次计算的结果 2.需要基于上一个结果来进行计算&#xff0c;被称为有状态计算 1.2 未使用有状态计算 1.下面这个代码将相同的key发送到同一个task任务里面计算。就是因为这个导致了&#xff0c;明明之前没有输入b&#xff0c;但是输入b之…

【鸿蒙】开发之页面跳转组件—实现页面跳转方法汇总!

①不同 Slice 间跳转&#xff0c;同一个 Ability 中&#xff0c;优点是方便&#xff0c;高效&#xff0c;缺点是业务逻辑复杂度受限。 button.setClickedListener(listener -> present(new SecondAbilitySlice(), new Intent()) );②使用 Intent 借助于 ElementName&#x…

【管理咨询宝藏126】德勤咨询为某大型机械集人才体系发展思路方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏126】德勤咨询为某大型机械集人才体系发展思路方案 【格式】PDF版本 【关键词】人力咨询、人才体系、人才盘点 【核心观点】 - 中国整车与零部件…

七天进阶elasticsearch[two]

批量保存 批量保存是通过_bulk API来实现的 请求方式 post 请求地址 _bulk 通过_bulk操作文档,一般至少有两行参数 第一行用于确定要干什么(插入,修改还是删除) 第二行才是操作的数据; 当然以上是标准操作,也可以不遵循标准操作,使用不同的请求方式来完成 批量保存demo…

故障预警 vs 故障分类:哪个更有意义,哪个更具挑战性?

故障预警 vs 故障分类&#xff1a;哪个更有意义&#xff0c;哪个更具挑战性&#xff1f; 在现代工业系统中&#xff0c;风力发电机、制造设备等关键装置的可靠性和稳定性对生产效率至关重要。为此&#xff0c;故障预警和故障分类成为保障设备正常运行的重要手段。那么&#xf…

备份和恢复realme智能手机:综合指南

realme自2018年成立至今&#xff0c;一直秉持着“敢于超越”的品牌精神&#xff0c;专注于为全球年轻用户提供性能卓越、设计新颖的高品质手机。对于如何备份和恢复realme手机&#xff0c;本文将介绍多种不同的方法。 第1部分&#xff1a;使用Coolmuster Android Backup Mana…

怎解ESP-ADF组件 error: unknown type name ‘xSemaphoreHandle‘

没有定义&#xff0c;看一下最上面的头文件。 通过看最上面的头文件引入&#xff0c;可以看到信号量头文件已经有了&#xff0c;那很明显就是类型的兼容的问题&#xff0c;打开MenuConfig开启向后兼容API的选项。 问题解决。

CVE-2024-2961:将phpfilter任意文件读取提升为远程代码执行(RCE)

0x00 前言 前几天p牛师傅在星球发了一个帖子&#xff1a;PHP利用glibc iconv()中的一个缓冲区溢出漏洞CVE-2024-2961&#xff0c;实现将文件读取提升为任意命令执行漏洞&#xff0c;当时觉得这个漏洞蛮有意思&#xff0c;就想研究一下。于是web狗开启了一次二进制漏洞的学习之…

输出有10个元素的整型数组各元素的值

&#xff08;1&#xff09;下标法 编写程序&#xff1a; &#xff08;2&#xff09;指针法&#xff1a; 将上面程序第7行和第10行的a[i]改为"*(ai)"。 &#xff08;3&#xff09;用指针变量指向数组元素 编写程序&#xff1a; 运行结果&#xff1a; 对3种方法的比…

家政上门按摩小程序源码 仿东郊到家小程序源码

家政上门按摩小程序源码 仿东郊到家小程序源码 实用行业 适用于&#xff1a;预约私教&#xff0c;预约瑜伽/健身、预约美容/美发/美甲、预约理疗/足疗/推拿、预约清洁/保洁/保安、预约洗车/维修/安装、预约保姆/月嫂/护工/洗衣/烧饭、钟点工等暖心服务。在家政市场上&#xf…

数据结构复习

基本概念和术语&#xff1a; 数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。 数据元素&#xff1a;是组成数据的&#xff0c;具有一定意义的基本单位&#xff0c;在计算机…

ChatGPT Prompt技术全攻略-入门篇:AI提示工程基础

系列篇章&#x1f4a5; No.文章1ChatGPT Prompt技术全攻略-入门篇&#xff1a;AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇&#xff1a;深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇&#xff1a;掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…