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