String字符串(黑马)

API和API帮助文档



java.lang包是提供对Java编程语言设计至关重要的类,由JVM自动导入

String类概述

字符串和基础类型进行+操作,都会进行拼接
下面的登录要运用字符串的比较,这和字符串的比较有关

在一个游戏中,出现敏感词将不会进行展示,将会用星号进行替换,实际上这和字符串的替换有关
下面和将金额转换成中文大写,这实际上和字符串的转换有关


创建字符串的两种方式


构造方法演示

package com.an.a;
//字符串创建对象的方式
public class StringTest {
    public static void main(String[] args) {
        //1.直接赋值
        String s1 ="hello";
        //2.用构造方法的方式赋值
        //2.1空参构造
        String s2 = new String();
        //2.2.传递一个字符串 按照字符串创建新的字符串
        String s3 = new String("this world");
        System.out.println(s3);//this world
        //2.3.传递一个字符数组 按照字符串数组的内容创建一个新的字符串
        char[] a = {'a','b','c'};
        String s4 = new String(a);//因为字符串内容的不可变,但是数组的内容可变,我们可以利用字符数组内容可变的特性来修改字符串里面的具体值
        System.out.println(s4);//abc
        //2.4.传递一个字节数组,按照字节数组的内容创建一个新的字符串对象
        //按照查询所对应的ASCII表创建新的字符串内容
        //应用场景:以后在网络当中传递的数据其实都是字节信息
        //我们要把字节信息进行转换,转成字符串,此时就要用到这个构造了
        byte[] bytes={96,97,98};
        String s5 = new String(bytes);
        System.out.println(s5);
    }
}





new出来的内存图展示

直接赋值代码简单而且还解决内层

字符串的比较



想比较内容,该怎么办

package com.an.a;
//字符串的比较
public class StringTest {
    public static void main(String[] args) {
       /*
       equals 比较字符串
       equalsIgnoreCase  忽略大小写比较
        */
        String str1 = "abc";//直接赋值
        String str2 = new String("abc");//new对象
        //1.==比较
        System.out.println(str1==str2);//false
        //2.equals比较内容
       boolean result = str1.equals(str2);
        System.out.println(result);//true
        System.out.println("---------------------------------------------------------------");
        //3.忽略大小写比较
        String a = "CCC";
        String b = new String("ccc");
        boolean reuslt1 = str1.equalsIgnoreCase(str2);
        System.out.println(reuslt1);//true
    }
}

练习- 用户登录

问题引出:

package com.an.a;
import java.util.Scanner;
//字符串的比较(键盘录入)
public class StringTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.next();//通过键盘录入字符串
       String s1 = "abc";
        //String s1 = new String("abc");
        System.out.println(s1==s);//false
    }
}

为社么键盘录入的字符串和直接赋值的字符串的地址不同(他们的字符串内容相同)
通过跟进next方法的源码,可以知道next方法最终是根据new出来的字符串

结论:以后只要想比较字符串的内容,就必须使用String类里面的方法(equals和equalsIgnoreCase)

idea快捷键 ctrl+alt+t用语句包裹代码块

package com.an.a;
import java.util.Scanner;
//字符串的比较(键盘录入)
public class StringTest {
    public static void main(String[] args) {
       /*
            已知正确的用户名和密码,请用程序实现模拟用户登录
            总共给3次机会,登录之后,给出相应的提示
        */
        //定义正确的账号和密码
        String rightUser = "zhangsan";
        String rightPassWord = "123456";
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入你的账户:");
             String myUser = sc.next();
            System.out.println("请输入你的密码:");
             String myPassWord = sc.next();
             //验证账户和密码的正确性
            if(myUser.equals(rightUser) && myPassWord.equals(rightPassWord)){
                System.out.println("登录成功!");
                break;
            }else {
                if(i==2){
                    //最后一次输入也错误,要提示账号被锁定
                    System.out.println("账号"+myUser+"被锁定,请联系康师傅公司是官方客服");
                }else {
                    System.out.println("账号或密码错误 登录失败"+"你还有"+(2-i)+"次机会");
                }

            }
        }
    }
}

遍历字符串和统计字符个数

字符串的遍历的快捷键为字符串.length().for

package com.an.a;
import java.util.Scanner;
//字符串的比较(键盘录入)
public class StringTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String str = sc.next();
        for (int i = 0; i < str.length(); i++) {//字符串的遍历的快捷键为字符串.length.for
            char c = str.charAt(i);//取出当前位置索引对应的字符串
            System.out.println(c);
        }

    }
}


char类型的变量在参与计算的时候自动类型提升为int ,通过ASCII查询

package com.an.a;
import java.util.Scanner;
//字符串的比较(键盘录入)
public class StringTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String str = sc.next();
        int smallCount = 0;
        int bigCount = 0;
        int numberCount = 0;
        for (int i = 0; i < str.length(); i++) {//字符串的遍历的快捷键为字符串.length.for
            char c = str.charAt(i);//取出当前位置索引对应的字符串
            if(c>='a'&& c<='z'){
                smallCount++;
            }else if(c>='A' && c<='Z'){
                bigCount++;
            }else if(c>='0' && c<='9'){
                numberCount++;
            }

        }
        System.out.println("大写字符有"+bigCount+"个");
        System.out.println("小写字符有"+smallCount+"个");
        System.out.println("数字字符有"+numberCount+"个");

    }
}

package com.an.a;
import java.util.Scanner;
//字符串的比较(键盘录入)
public class StringTest {
    public static void main(String[] args) {
       /*
       将int数组里面的数据拼接成一个字符串进行返回
        */
        int a[] = {1,3,4,5,6,9};
         String s = creatString(a);
       //遍历字符串
        System.out.print("[");
        for (int i = 0; i < s.length(); i++) {

            if(i!=s.length()-1){
                System.out.print(s.charAt(i)+",");
            }else {
                System.out.print(s.charAt(i));
            }
        }
        System.out.print("]");


    }
    public static String creatString(int []a){
        String str="";
        for (int i = 0; i < a.length; i++) {
            str+=a[i];
        }
        return str;
    }
}

package com.an.a;
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        //定义方法实现字符串的反转操作
      String a ="123456";
       String s = stringReserve(a);
        System.out.println(s);

    }
    public static  String stringReserve(String str){
        String result = "";
        for (int i = str.length()-1; i >= 0; i--) {
           char c = str.charAt(i);
           result+=c;
        }
        return result;
    }
}




思路

金额转换可以作为小项目

package com.an.a;

import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        //实现金额转换
        /*
        先将Int类型的金额转换为大写(查表法)---->前面补零------->补齐单位(查表法)

         */
        //步骤1:转换数字 2135--》贰壹叁伍

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要转换的数字:");
        int money = sc.nextInt();
        String str="";//储存转换后的字符串
        if(money>=0&&money<=9999999){
            while (true) {
                int ge = money % 10;//取出各个位数
                String s = getCapitalNumber(ge);
              str= s+str;
                money = money / 10;
                if(money==0){
                    break;
                }
            }

        }else {
            System.out.println("输入的格式不正确");
        }
    //2.前面补零
       int count = 7 - str.length();//需要补零的个数
        for (int i = 0; i < count; i++) {
            str = "零" + str;
        }
        System.out.println(str);
        System.out.println(str.length());

     //3.插入单位(查表法)
        String[]arr = {"佰","拾","万","仟","佰","拾","元"};
        System.out.println(arr.length);
        //可以有拼接成字符串的方式和不拼接直接输出2种方式
        for (int i = 0; i < arr.length; i++) {//对于此处为社么用str.lentgth不行有异议

          char s = str.charAt(i);
          str = str +s+arr[i];
            //System.out.print(s);
            //System.out.print(arr[i]);
        }
        System.out.println(str);

    }

    //将数字转换为对应的中文大写并返回
    public static String getCapitalNumber(int number) {
        //中文对应表示
        String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        return arr[number];
    }
}

练习9

案例一手机号屏蔽



方法截取,只有返回值才是截取的结果,和原串没有影响

思路1--取出每一个字符按照下标规则进行拼接

package com.an.a;

public class StringDemo1 {
    public static void main(String[] args) {
        String PhoneNumber = "13245645678";
        String s = getNumber(PhoneNumber);
        System.out.println(s);//1324****678
    }
    //获取屏蔽后的字符串
    public static String getNumber(String str){
        String result="";
        for (int i = 0; i < str.length(); i++) {
            char s = str.charAt(i);
            if(i>=4&&i<8){
                result = result + "*";
            }else {
                result = result +s;

            }

        }
        return result;
    }
}

思路2---截取对应的字符进行拼接

package com.an.a;

public class StringDemo1 {
    public static void main(String[] args) {
        String PhoneNumber = "13245645678";
       String str1 = PhoneNumber.substring(0,3);//截取前三位
     String str2 = PhoneNumber.substring(7);//截取后三位
     //拼接
        String result = str1+"****"+str2;
        System.out.println(result);//132****5678
       
    }



}

案例--身份证号码查看

如下为需要达到的要求:

注意点:关于字符转换为对应的整数,如'8'转换为8,或者是'a'转换为对应的整数,可以借助ASCII表,找到和第一字符的ASII码的差值进行转换

package com.an.a;

public class StringDemo1 {
    public static void main(String[] args) {
       String id =  "421128200104261245";
       //获取出生年月日
       String year = id.substring(6,10);
       String month = id.substring(10,12);
       String day = id.substring(12,14);
        System.out.println("人物信息为:");
        System.out.println("出生年月日:"+year+"年"+month+"月"+day+"日");
      //获取性别
        //获取性别可以通过下标获取对应的字符,也可以通过截取获取对应的字符串
        char gender = id.charAt(16);
        //因为要判断性别的男女,所以必须将其转换为整形
        int sex = gender - 48;
      if(sex%2==0){//偶数为女性
          System.out.println("性别为:女");
      }else {
          System.out.println("性别为:男");
      }


    }



}

敏感词替换


package com.an.a;

public class StringDemo1 {
    public static void main(String[] args) {
       //敏感词替换
        //1.获取到说的话
        String talk = "你玩的真好,下次不要在玩了,TMD ,SB";
        //2.定义一个 敏感词库
        String[] arr = {"TMD","SB","GDX","CNM","MLGB"};
        for (int i = 0; i < arr.length; i++) {//循环敏感库,有相同的则替换
            talk = talk.replace(arr[i],"***");//将对应的字符串替换为***
        }
        System.out.println(talk);
    }



}

罗马数字的2种写法

第一种解题思想

package com.an.a;

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        /*
        通过键盘录入一个字符串,
        要求1:长度小于等于9
        要求2:只能是数字
        将内容变成罗马数字(罗马数字没有0)
         */
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        String str;
        while (true) {
            System.out.println("请输入一个字符串:");
            str = sc.next();
            boolean flag = chackStr(str);

            if (flag) {//满足正则要求
                break;


            } else {//不满足
                System.out.println("输入的字符串格式错误!");
            }

        }
        for (int i = 0; i < str.length(); i++) {
            char s = str.charAt(i);
            //因为是传入整数所以要将字符转换为整数
            int s1 = s - 48;
            String s2 = changeLuoma(s1);//此处可以直接输出也可以拼接成一个新的串
            sb.append(s2);

        }
        System.out.println(sb);

    }

    //输入字符串的正则判断
    public static boolean chackStr(String str) {
        if (str.length() > 9) {
            return false;
        } else {
            for (int i = 0; i < str.length(); i++) {
                char s = str.charAt(i);
                if (s < '0' || s > '9') {
                    return false;
                }
            }
        }
        return true;
    }

    //1.将字符串转换为罗马数字
    //2.将阿拉伯数字逐个转为罗马数字
    public static String changeLuoma(int number) {
        //用查表法
        String[] arr = {"", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"};
        return arr[number];
    }
}

思路2--用swich进行改写

调整字符串

第一种写法

package com.an.a;

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
      /*
      定义2个字符串A和B
      将A进行旋转操作 例如 abcde旋转一次变为bcdea
      如果经过多次旋转后A可以变成B,则返回true
      否则返回false
       */
        //定义2个字符串
        String strA = "abcde";
        String strB = "bcdea";
        boolean flag = false;
        for (int i = 0; i < strA.length(); i++) {
            strA=rotate(strA);
            if(strA.equals(strB)){
                flag = true;
            }
        }
        System.out.println(flag);

    }
    //实现字符串的旋转操作
    /*
    如果我们要修改字符串的内容(字符串内容不可见)
    可以有2个办法:
    1.可以用subString进行截取操作,把左边的内容截取出来拼接到右边
    2.可以把字符串变成一个字符串数组,然后改变字符串的内容,然后将字符数组变成字符串
     */
    //用subString进行截取
    public static String rotate(String str){
         char first = str.charAt(0);//用subString进行截取也可以
       String end = str.substring(1);//截取0索引后所有的字符串
        return end+first;//基础类型和字符串拼接自动转为字符串
    }


}

方式二 使用字符串数组

package com.an.a;

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
      /*
      定义2个字符串A和B
      将A进行旋转操作 例如 abcde旋转一次变为bcdea
      如果经过多次旋转后A可以变成B,则返回true
      否则返回false
       */
        //定义2个字符串
        String strA = "abcde";
        String strB = "bcdea";
        boolean flag = false;
        for (int i = 0; i < strA.length(); i++) {
            strA=rotate(strA);
            if(strA.equals(strB)){
                flag = true;
            }
        }
        System.out.println(flag);
        System.out.println(rotate(strA));
    }
    //实现字符串的旋转操作
    /*
    如果我们要修改字符串的内容(字符串内容不可见)
    可以有2个办法:
    1.可以用subString进行截取操作,把左边的内容截取出来拼接到右边
    2.可以把字符串变成一个字符串数组,然后改变字符串的内容,然后将字符数组变成字符串
     */
    //用字符串数组
    public static String rotate(String str){
       char first = str.charAt(0);//取出0索引上的字符
        char[] s = str.toCharArray();//将字符串转化为字符串数组
        for (int i = 0; i < s.length-1; i++) {//遍历字符数组
            s[i]=s[i+1];
        }
        s[s.length-1]=first;
        String result = new String(s);
        return result;
    }


}

字符串的内容不可变,如果我们以后要修改字符串里面的内容,可以有2种方式 1.将字符串改成字符数组,然后改变数组的内容,然后将数组改成字符串。方式2:有subString分别截取,然后进行拼接

打乱字符串的内容

package com.an.a;
import java.util.Random;
import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        //打乱字符串的内容
        final String result = changeString("abcde");
        System.out.println(result);

    }
    //要改变字符串的内容,用改为字符数组的方式
    public static String changeString(String str){
        char[] s = str.toCharArray();
        //打乱字符串的操作
        //通过交换随机索引的位置
        Random r = new Random();
        //产生2个随机索引
         int s1 = r.nextInt(s.length);
         int s2 = r.nextInt(s.length);
         //进行交换
        char ss=s[s1];
        s[s1]=s[s2];
        s[s2]=ss;

        String result = new String(s);
        return result;
    }
}

生成验证码

package com.an.a;
import java.util.Random;
import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        //给定2个非负整数字符串num1和num2,返回他们对应的整数相乘的字符串的表现形式
        //(默认相乘结果在int范围内)
        String str1= "12345";
        String str2 = "234";
        /*
        思路:1.将字符串转为Int
        2.参与计算
        3.将Int转为String
         */
        //用字符串的相关方法可以简单完成这个问题(但是假设没有学这些方法)
      int s2 = change(str1);
      int s1 = change(str2);
      int result =s1*s2;
        System.out.println(result+"");

    }
    //将字符串转化为对应的整数
    public static int change(String str){
        char[] s = str.toCharArray();
        int result=0;
        for (int i = 0; i < s.length; i++) {
            int a = s[i]-48;
            result = result*10+a;
        }
        return result;
    }
}

小项目--学生管理系统

需求文档见资料day11

  • 需求

    把业务逻辑画图画出来
    break语句可以跳出循环和swich语句,但是当两者嵌套时,只能跳出最内层的语句


基础版本

Student类

package StudentSystems;

public class Student {
    //id name age address
    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;
    }

    /**
     * 获取
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return address
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return "Student{id = " + id + ", name = " + name + ", age = " + age + ", address = " + address + "}";
    }
}

测试类

package StudentSystems;

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

//测试类
public class StudentSystem {
    public static void main(String[] args) {
        //创建一个集合来储存学生信息
        ArrayList<Student> list = new ArrayList<>();

        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.println("请输入你的选择:");
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();//
        switch (choose) {
                //添加1
                case "1":{
                    addStudent(list);
                    break ;
                }
                    //删除
                case "2":{
                    System.out.println("请输入要删除学生的id");
                    Scanner st = new Scanner(System.in);
                    String id = st.next();
                    if(chackid(list,id)==false){//不存在该id
                        break ;//返回主菜单
                    }
                   //存在该id
                   int index = getIndex(list, id);
                    list.remove(index);
                    System.out.println("删除成功");
                    break ;
                }
                    //修改
                case "3":{
                    System.out.println("请输入要修改的学生的id");
                    Scanner st = new Scanner(System.in);
                    String id= st.next();
                    //判断该id信息是否存在
                    if(chackid(list,id)==true){//该id存在
                        int index = getIndex(list, id);//获取该id对应的索引
                        //后面进行修改操作
                        System.out.println("请输入要修改学生的姓名");
                      String newName=  st.next();
                      list.get(index).setName(newName);
                        System.out.println("请输入要修改的年龄");
                        int newAge = st.nextInt();
                        list.get(index).setAge(newAge);
                        System.out.println("请输入要修改的家庭住址");
                        String newAddress = st.next();
                       list.get(index).setAddress(newAddress);
                        System.out.println("学生信息修改成功");
                        break ;
                    }else {
                        System.out.println("该id不存在");
                        break ;
                    }

                }
                    //查询
                case "4":{
                    quaryStudent(list);
                    break ;
                }
                    //退出
                case "5": {//如果此时要退出程序 一个break只能退出swich
                  //  break loop;//标识退出循环
                    System.exit(0);//虚拟机停止运行
                }
                default: {
                    System.out.println("输入有误 请重新输入");
                }


            }
        }
    }
    //查询学生
    public static void quaryStudent(ArrayList<Student> list){
        System.out.println("查询学生");
        if(list.size()==0){
            System.out.println("当前无学生信息,请添加后再查询");
            return;
        }
        System.out.println("id\t\t姓名\t年龄\t家庭住址");
        for (int i = 0; i < list.size(); i++) {
            Student st = list.get(i);//通过索引获取对象
            System.out.println(st.getId()+"\t"+st.getName()+"\t"+st.getAge()+"\t"+st.getAddress());

        }
    }
    //添加学生
    public static void addStudent(ArrayList<Student>list){
        Scanner st = null;
        String id = null;
        while (true) {
            System.out.println("添加学生");
            st = new Scanner(System.in);
            System.out.println("请输入学生的id");
            id = st.next();
            //判断id是否重复,重复则需要重新输入
            if(chackid(list,id)==false){
                System.out.println("id输入重复 请重新输入");
                break;
            }
        }
        System.out.println("请输入学生的姓名");
        String name = st.next();
        System.out.println("请输入学生的年龄");
        int age = st.nextInt();
        System.out.println("请输入学生的家庭住址");
        String address = st.next();
        Student s = new Student(id,name,age,address);//创建对象
        list.add(s);//添加到集合
        System.out.println("添加成功");
    }
    //判断id是否重复
    public static boolean chackid(ArrayList<Student>list,String id){
        for (int i = 0; i < list.size(); i++) {
             Student st = list.get(i);//得到对象
           boolean ch = st.getId().equals(id);
           if(ch==true){
               return true;
           }
        }
        return false;
    }
    //如果id存在则执行删除操作
    //思路;通过id找到其对象对应的索引
    public static int getIndex(ArrayList<Student>list,String id){
        for (int i = 0; i < list.size(); i++) {
            Student st = list.get(i);
            boolean flag = st.getId().equals(id);
            if(flag==true){
                return i;
            }
        }
        return -1;
    }
}

学生管理系统升级


在基础版本的基础上增加 登录 注册 忘记密码的功能

业务框架分析

用户注册逻辑分析

用户登录逻辑分析

忘记密码操作逻辑

alt+enter提示该错误的解决方案


将2步进行拼接

登录部分App类(测试类)

package StudentSystems;

import java.security.spec.RSAOtherPrimeInfo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

//学生管理系统的升级版
public class App {
    public static void main(String[] args) {
        ArrayList<Users> list = new ArrayList<>();//用户储存用户信息
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作1登录 2注册 3忘记密码 4退出程序");

            String choose = sc.next();
            switch (choose) {
                case "1": {
                    System.out.println("登录");
                    login(list);
                    break;
                }
                case "2": {
                    System.out.println("注册");
                    register(list);
                    break;
                }
                case "3": {
                    System.out.println("忘记密码");
                    forgetPassword(list);
                    break;
                }
                case "4": {
                    System.out.println("退出程序");
                    System.exit(0);
                }
                default: {
                    System.out.println("输入错误");
                }

            }
        }
    }

    public static void forgetPassword(ArrayList<Users> list) {//忘记密码
        Scanner sc = new Scanner(System.in);
        System.out.println("忘记密码");
        System.out.println("请输入用户名:");
        String userName = sc.next();
        final boolean flag = checkuserName(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);
        final Users user = list.get(index);
        if(!(user.getPhoneNumber()
                .equals(phoneNumber)&&user.getPersonId().equals(personId))){
            System.out.println("身份证或手机号码输入有误,不能修改密码");
        }
        //当执行到这里,所有的数据全部验证成功,直接修改即可
        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("两次密码输入不一致,请重新输入");
            }
        }
        //直接修改密码
        user.setPassWord(password);
        System.out.println("密码修改成功");
    }
    public static int findindex(ArrayList<Users>list,String username){
        for (int i = 0; i < list.size(); i++) {
            final Users users = list.get(i);
            if(users.getUserName().equals(username)){
                return i;
            }
        }
        return -1;
    }

    public static void register(ArrayList<Users> list) {//注册
        //将用户名 身份号 密码 电话号码放到user中 然后将user添加到集合中
        //开发细节:先验证格式是否正确,在验证是否唯一
        Scanner st = new Scanner(System.in);
        String userName=null;
        while (true) {
            System.out.println("请输入用户名");
            userName = st.next();
            //验证用户名的格式
            boolean flag = contain(userName);
            if (flag) {
                //格2式正确
                //将验证唯一性
                if (checkuserName(list, userName)) {
                    System.out.println("用户名" + userName + "已经存在,请重新输入");
                } else {
                    System.out.println("用户名可用");
                    break;//用户名没有重复
                }


            } else {
                System.out.println("用户格式不正确,需要重新输入");
            }
        }
        String password=null;
        while (true) {
            System.out.println("请输入你的密码:");
            password = st.next();
            System.out.println("请再次输入你的密码:");
            String againpassword = st.next();
            if(!(password.equals(againpassword))){//两次密码不一致
                System.out.println("两次密码输入不一致,请重新输入");
            }else {
                break;
            }
        }
        //验证身份证号码
      /*
      1.长度18为不能以0开头
      2.前17位必须位数字
      3.最后一位可以是数字也可以是大写x或小写x
       */
        String personId=null;
        while (true) {
            System.out.println("请输入你的身份证号码");
            personId = st.next();
            if(chackPersonId(personId)){

                break;
            }else {
                System.out.println("身份证号码输入有误,请重新输入");
                continue;
            }
        }
        String phoneNumber=null;
        while (true) {
            System.out.println("请输入你的手机号码");
            phoneNumber = st.next();
            if(checkphoneNumber(phoneNumber)){//格式正确
                System.out.println("身份证输入成功");
                Users user1 = new Users(userName,password,personId,phoneNumber);
                list.add(user1);
                System.out.println("注册成功!");
                for (int i = 0; i < list.size(); i++) {
                    Users user = list.get(i);
                    System.out.println(user.getUserName()+" " +
                            " "+user.getPassWord()+" "+user.getPersonId()+" "+user.getPhoneNumber());
                }
                break;
            }else {
                System.out.println("输入格式错误,请重新输入");
            }
        }
    }
    //校验身份证号码
    public static boolean chackPersonId(String personId){
        int len = personId.length();
        if(len!=18){
            return false;
        }
        boolean flag= personId.startsWith("0");
        if(flag){
            return false;
        }
        //前17位必须是数字
        for (int i = 0; i < personId.length()-1; i++) {
            char c= personId.charAt(i);
            if(!(c>='0' && c<='9')){
                return false;
            }
        }
        //最后一位可以为数字,也可以为大小写的x
        char end = personId.charAt(personId.length()-1);
        if(!(end>'0' && end<='9' || end=='x' ||end=='X')){
            return false;
        }
        return true;
    }


    public static void login(ArrayList<Users> list) {//登录
        Scanner st = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名:");
            String userName = st.next();
            boolean flag = checkuserName(list, userName);
            if(!flag){//用户名不存在
                System.out.println("用户名"+userName+"未注册,请先注册再登录");
                return;
            }
            System.out.println("请输入密码:");
            String password = st.next();
            while (true) {
                String rightCode = getCode();
                System.out.println("验证码为:"+rightCode);
                System.out.println("请输入验证码:");
                String code = st.next();
                if(code.equalsIgnoreCase(rightCode)){
                    System.out.println("验证码正确");
                    break;
                }
            }
            //验证用户名和密码是否正确
            //利用封装的思想将零散的数据封装成一个对象进行传输
            Users userinfo = new Users(userName,password,null,null);
            boolean result =  chackUserInfo(list,userinfo);
            if(result){
                System.out.println("登录成功,可以开始使用学生管理系统了");
                break;
            }else {
                System.out.println("用户名或密码错误");
                if(i==2){
                    System.out.println("当前账号"+userName+"被索引,请练***x公司的客服");
                }else {
                    System.out.println("还剩下"+(2-i)+"次机会");
                }
            }
        }

    }

    public static boolean contain(String userName) {
        //验证用户名的格式
        //长度3~15
        int len = userName.length();
        if (len < 3 || len > 15) {
            return false;
        }
        //此时用户名长度已经正确
        //只能是字母加数字的组合,但不能是纯数字
        //先验证是字母加数字
        for (int i = 0; i < userName.length(); i++) {
            char c = userName.charAt(i);//获取每一个字符
            if (!(c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) {
                return false;
            }
        }
        //验证为纯数字
        int count = 0;//用于记录字母的个数
        for (int i = 0; i < userName.length(); i++) {
            char c = userName.charAt(i);
            if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {
                count++;
                break;
            }

        }
        if (count == 0) {
            return false;
        }
        return true;
    }

    //验证用户名的唯一性
    public static boolean checkuserName(ArrayList<Users> list, String userName) {
        for (int i = 0; i < list.size(); i++) {
            Users name = list.get(i);
            if (name.getUserName().equals(userName)) {
                return true;
            }
        }
        return false;
    }
    //验证手机号码的合法性
    public static boolean checkphoneNumber(String phoneNumber){
        /*
        长度11位
        不能以0为开头
        必须都是数字
         */
        int len = phoneNumber.length();
        if(len!=11){
            return false;
        }
        final boolean flag = phoneNumber.startsWith("0");
        if(flag){
            return false;
        }
        for (int i = 0; i < phoneNumber.length(); i++) {
            char c = phoneNumber.charAt(i);
            if(!(c>='0' && c<='9')){
                return false;
            }
        }
        return true;
    }
    //获取随机的验证码
    public static String getCode(){
        //先用随机数+查表法获取4个字母
        //用集合储存可以不用考虑索引(也可以使用数组储存)
        ArrayList<Character> list = new ArrayList<>();//用于储存大小写字符
        for (int i = 0; i < 26; i++) {
            list.add((char)('a'+i));
            list.add((char)('A'+i));
        }
        //随机获取4个字符
        Random r = new Random();
        StringBuilder sb = new StringBuilder();//用户储存4位字母验证码
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(list.size());//获取随机索引
            char c = list.get(index);//获取随机字母
            sb.append(c);

        }
        //获取一个随机数字
        int number = r.nextInt(10);
        sb.append(number);
        //要想数字出现在任意位置,要改变字符串
        //可以变成字符数组然后在改变
        //用最后一个位置的数组和任意索引的字符交换位置即可
        char[] num = sb.toString().toCharArray();
        //获取一个随机索引
        int indexs = r.nextInt(5);
        //交换位置
        char tem=num[indexs];
        num[indexs]=num[4];
        num[4]=tem;

        return new String(num);
    }
    //用于验证用户名和密码是否正确
    public static boolean chackUserInfo(ArrayList<Users>list,Users useinfo){
        for (int i = 0; i < list.size(); i++) {//遍历集合
            Users users = list.get(i);
            if(users.getUserName().equals(useinfo.getUserName()) && users.getPassWord().equals(useinfo.getPassWord())){
                return true;
            }
        }
        return false;
    }
}

用户类

package StudentSystems;
// 属性:用户名、密码、身份证号码、手机号码
public class Users {//用户类
    private String userName;
    private String passWord;
    private String personId;
    private String phoneNumber;

    public Users() {
    }

    public Users(String userName, String passWord, String personId, String phoneNumber) {
        this.userName = userName;
        this.passWord = passWord;
        this.personId = personId;
        this.phoneNumber = phoneNumber;
    }

    /**
     * 获取
     * @return userName
     */
    public String getUserName() {
        return userName;
    }

    /**
     * 设置
     * @param userName
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * 获取
     * @return passWord
     */
    public String getPassWord() {
        return passWord;
    }

    /**
     * 设置
     * @param passWord
     */
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    /**
     * 获取
     * @return personId
     */
    public String getPersonId() {
        return personId;
    }

    /**
     * 设置
     * @param personId
     */
    public void setPersonId(String personId) {
        this.personId = personId;
    }

    /**
     * 获取
     * @return phoneNumber
     */
    public String getPhoneNumber() {
        return phoneNumber;
    }

    /**
     * 设置
     * @param phoneNumber
     */
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String toString() {
        return "Users{userName = " + userName + ", passWord = " + passWord + ", personId = " + personId + ", phoneNumber = " + phoneNumber + "}";
    }
}

学生管理系统的主体结构已经完成,后面自己再熟练一下

posted @ 2023-01-15 22:05  一往而深,  阅读(50)  评论(0编辑  收藏  举报