【Java基礎06】ArrayList

文章目錄

  • 1.ArrayList
    • 1.1 集合的基本使用
    • 1.2 集合的創建和成員方法
    • 1.3 練習一:集合的遍歷
      • 基本數據類型對應的包裝類
    • 1.4 練習二:使用集合存儲并遍歷學生對象
    • 1.4 練習三:添加用戶對象并判斷是否存在
      • 寫方法要思考的步驟
    • 1.5 練習四:添加手機對象并返回要求的數據
      • 技巧:如果要返回多個數據,可以把這些數據先放進一個容器當中,再把容器返回。如集合,數組。
  • 2 綜合練習1:學生管理系統
    • **學生類**
    • StudentSystem
      • 注意點(循環檢驗,查找滿足某條件的對象是否存在)
  • 2 綜合練習2:學生管理系統升級版
    • User類
    • App
      • 封裝思想
      • 多寫一步可讀性高
      • 如何調整字符串中內容
      • 其他注意點

本文部分參考本篇文章

1.ArrayList

1.1 集合的基本使用

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

集合有很多,如下圖所示,本節所介紹的是其中一種:ArrayList
在這里插入圖片描述

1.2 集合的創建和成員方法

成員方法:可以按照增刪改查去記憶
在這里插入圖片描述

package ArrayList;import java.util.ArrayList;public class ArrayListDemo1 {public static void main(String[] args) {//1.創建集合的對象//泛型:限定集合中存儲數據的類型。也就是那個<>,需要在類名后面加上<>表示數據類型//ArrayList<String> list = new ArrayList<String>();//JDK7ArrayList<String> list = new ArrayList<>();//此時我們創建的是ArrayList的對象,而ArrayList是java已經寫好的一一個類//這個類在底層做了一些處理//Point! 打印對象不是地址值,而是集合中存儲數據內容//Point! 在展示的時候會拿[]把所有的數據進行包裝,逗號空格作為分隔System.out.println(list);//2.集合的成員方法//2.1添加元素//2.1.1末尾添加boolean result = list.add("A"); //會有返回值,但一般不用管,默認是ture,只需要使用添加功能就行System.out.println(result);System.out.println(list);list.add("A");list.add("B");list.add("C");System.out.println(list);//2.1.2 給定位置插入list.add(1,"A"); //在索引 1 的位置插入 "A“,原來這個位置及后面的元素會向后移動一位。//2.2 刪除元素//2.2.1 根據元素值刪除list.remove("B");//也有boolean返回值,刪除成功返回true,失敗返回false(要刪除的元素不存在)System.out.println(list);boolean result2 = list.remove("D");System.out.println(result2);System.out.println(list);//2.2.2 根據索引刪除//會返回被刪除的元素String str = list.remove(0);System.out.println(str);System.out.println(list);//2.3 修改元素//會返回被覆蓋的元素(原來的舊值)String str1 = list.set(0,"aaa");System.out.println(str1);System.out.println(list);//2.4 查詢元素//2.4.1 根據索引查詢//會返回查詢到的元素String str2 = list.get(0);System.out.println(str2);//2.4.2 獲取集合的長度 + 遍歷for (int i = 0; i < list.size(); i++) { //list.fori即可得到String str3 = list.get(i);System.out.println(str3);}}
}

1.3 練習一:集合的遍歷

定義一個集合,添加字符串,并進行遍歷 遍歷格式參照: [元素1, 元素2,元素3]。

package ArrayList;import java.util.ArrayList;
import java.util.StringJoiner;public class ArrayListTest01 {public static void main(String[] args) {//定義一個集合,添加字符串,并進行遍歷 遍歷格式參照: [元素1,元素2,元素3]。ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");list.add(1,"E"); //在索引 1 的位置插入 "E“,原來這個位置及后面的元素會向后移動一位。System.out.println(list);//方法一:使用sj(因為有開頭結尾和間隔符進行聯想)StringJoiner sj = new StringJoiner(",","[","]");//list.forEach(sj::add); //簡略版本for (int i = 0; i < list.size(); i++) {sj.add(list.get(i));}System.out.println(sj.toString());System.out.print("["); //注意這里是得是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("]");//注意,如果是添加數字,要變成對應包裝類ArrayList<Integer> list2 = new ArrayList<>(); //注意不是int,是Integer//jdk5以后int Integer之間是可以互相轉化的list2.add(1);list2.add(2);list2.add(3);System.out.println(list2);ArrayList<Character> list3 = new ArrayList<>();list3.add('A');list3.add('B');list3.add('C');System.out.println(list3);}
}

基本數據類型對應的包裝類

集合中如果要添加基本數據類型,需要變成其對應的包裝類
在這里插入圖片描述

1.4 練習二:使用集合存儲并遍歷學生對象

需求:
定義一個集合,添加一些學生對象,并進行遍歷
學生類的屬性為:姓名,年齡。
要求:
對象的數據來自鍵盤錄入

package ArrayList;import java.util.ArrayList;
import java.util.Scanner;public class ArrayListTest02 {public static void main(String[] args) {/*需求:定義一個集合,添加一些學生對象,并進行遍歷學生類的屬性為:姓名,年齡。要求:對象的數據來自鍵盤錄入*///1.創建集合ArrayList<ArrayTest02_Stu> list = new ArrayList<>();////2.創建學生對象//ArrayTest02_Stu s1 = new ArrayTest02_Stu("zhangsan",23);//ArrayTest02_Stu s2 = new ArrayTest02_Stu("lisi",24);//ArrayTest02_Stu s3 = new ArrayTest02_Stu("wangwu",25);//2.鍵盤錄入學生的信息Scanner scanner = new Scanner(System.in);for (int i = 0; i < 2; i++) {System.out.println("輸入名字");//point 每次會創建新的string對象,因此不會是同一個地址//point 如果把創建對象放在外部,那么每次list.add都是同一個地址,會產生輸出的都是最后一次輸入的值的情況String name = scanner.next();System.out.println("輸入年齡");int age = scanner.nextInt();list.add(new ArrayTest02_Stu(name, age));}//3.添加元素//list.add(s1);  //point! 注意添加的是這個對象所在的地址,所以每次添加必須得創建多個對象,不然只能把一個對象來回添加多次//list.add(s2);//list.add(s3);//4.遍歷集合for (int i = 0; i < list.size(); i++) {ArrayTest02_Stu stu = list.get(i);//輸出的時候需要get,不然我們自己定義的類沒有特殊處理直接print是地址值//System.out.println(stu);System.out.println(stu.getName() + "," + stu.getAge());}}
}

循環中注意每次放置進列表的都必須是一個新對象
如果把創建對象放在外部,那么每次list.add都是同一個地址,會產生輸出的都是最后一次輸入的值的情況
在這里插入圖片描述

1.4 練習三:添加用戶對象并判斷是否存在

在這里插入圖片描述
本題重點就是查找的方法,可以設置boolean返回值,遍歷查找是否相同。

package ArrayList;import java.util.ArrayList;
import java.util.Scanner;public class ArrayListTest03 {public static void main(String[] args) {ArrayList<ArrayTest03_User> list = new ArrayList<>();Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("輸入第"+(i+1)+"個用戶的id");int id = sc.nextInt();System.out.println("輸入用戶姓名");String name = sc.next();System.out.println("輸入用戶密碼");String password = sc.next();list.add(new ArrayTest03_User(id, name, password));}//輸入查找的idSystem.out.println("請輸入需要查找的id");int sid = sc.nextInt();boolean result = search(list, sid);System.out.println(result);}//寫函數需要考慮的內容//1.這個方法用來干嘛?//2.這個方法需要哪些內容才能完成?//3.調用處是否需要使用方法返回的結果?public static boolean search(ArrayList<ArrayTest03_User> list, int sid){ //point 注意這里要指定類型// point!不能直接查,因為不一定能查到,查不到的話直接報錯,無法返回boolean值!//遍歷比較合適for (int i = 0; i < list.size(); i++) {ArrayTest03_User user = list.get(i);int id = user.getId();if(id == sid){return true;}}return false;}
}

寫方法要思考的步驟

//寫函數需要考慮的內容
//1.這個方法用來干嘛?
//2.這個方法需要哪些內容才能完成?
//3.調用處是否需要使用方法返回的結果?

1.5 練習四:添加手機對象并返回要求的數據

在這里插入圖片描述

package ArrayList;import java.util.ArrayList;public class ArrayListTest04 {public static void main(String[] args) {ArrayList<ArrayTest04_Phone> list = new ArrayList<>();ArrayTest04_Phone p1 = new ArrayTest04_Phone("小米",1000);list.add(p1);ArrayTest04_Phone p2 = new ArrayTest04_Phone("蘋果",8000);list.add(p2);ArrayTest04_Phone p3 = new ArrayTest04_Phone("錘子",2000);list.add(p3);ArrayList<ArrayTest04_Phone> result_list = search(list);if (result_list != null) {for (int i = 0; i < result_list.size(); i++) {System.out.println("品牌為"+result_list.get(i).getBrand()+","+"價格為"+result_list.get(i).getPrice());}}else{System.out.println("沒有低于3000的手機");}}//point 技巧://如果要返回多個數據,可以把這些數據先放進一個容器當中,再把容器返回//如集合,數組public static ArrayList<ArrayTest04_Phone> search(ArrayList<ArrayTest04_Phone> list){ArrayList<ArrayTest04_Phone> slist = new ArrayList<>();for (int i = 0; i < list.size(); i++) {if( list.get(i).getPrice() <= 3000 ){slist.add(list.get(i));}}return slist;}
}

技巧:如果要返回多個數據,可以把這些數據先放進一個容器當中,再把容器返回。如集合,數組。

2 綜合練習1:學生管理系統

  • 案例需求
    針對目前我們的所學內容,完成一個綜合案例:學生管理系統。
    該系統主要功能如下:

    ? 添加學生:通過鍵盤錄入學生信息,添加到集合中

    ? 刪除學生:通過鍵盤錄入要刪除學生的學號,將該學生對象從集合中刪除

    ? 修改學生:通過鍵盤錄入要修改學生的學號,將該學生對象其他信息進行修改

    ? 查看學生:將集合中的學生對象信息進行展示

    ? 退出系統:結束程序

學生類

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

StudentSystem

package StudentSystem;import java.util.ArrayList;
import java.util.Scanner;public class StudentSystem {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();Scanner sc = new Scanner(System.in);boolean flag = false;while(!flag) {  //可以用loop,flag,exit(0)表示退出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("請輸入你的選擇:");int choice = sc.nextInt();switch (choice) {case 1 -> addStudent(list);  //箭頭是新版,用冒號的話得另外寫breakcase 2 -> deleteStudent(list);case 3 -> updateStudent(list);case 4 -> queryStudent(list);case 5 -> {System.out.println("退出");flag = true;}default -> System.out.println("沒有這個選項");}}}public static void addStudent(ArrayList<Student> list) {System.out.println("進入添加學生板塊");Scanner sc = new Scanner(System.in);System.out.println("請輸入學生id");String id = sc.next();//while (true) { //point 這段整復雜了,還沒考慮到二次檢查//    boolean containId = contains(list, id);//    if (containId) {//        System.out.println("已經存在同樣的ID,請換一個");//    } else{//        System.out.println("ID有效");//        break;//    }//    System.out.println("請輸入新的id");//    id = sc.next(); //point 在循環外部聲明的,不會隨著循環結束消失//}//我的寫法boolean containId = contains(list, id);while (containId) {System.out.println("已經存在同樣的ID,請換一個");System.out.println("請輸入新的id");id = sc.next();containId = contains(list, id);}System.out.println("ID有效");//視頻的寫法是先定義一個null的id,然后在while中輸入,用if判斷,滿足條件可以breakSystem.out.println("請輸入姓名");String name = sc.next();System.out.println("請輸入年齡");int age = sc.nextInt();System.out.println("請輸入地址");String address = sc.next();list.add(new Student(id, name, age, address)); //也可以拆開用setSystem.out.println("學生信息添加成功");}public static void deleteStudent(ArrayList<Student> list) {System.out.println("進入刪除學生板塊");Scanner sc = new Scanner(System.in);System.out.println("請輸入要刪除的id");String id = sc.next();//檢查id是否存在//point 可以直接看gexIndex是否大于0boolean containId = contains(list, id);if (containId) {System.out.println("存在該id");//ArrayList通過ID獲取idx的部分得自己寫int idx = getIndex(list, id);list.remove(idx);System.out.println("刪除成功");}else{System.out.println("不存在該id");return;}}public static void updateStudent(ArrayList<Student> list) {System.out.println("進入修改學生板塊");Scanner sc = new Scanner(System.in);System.out.println("請輸入要修改的id");String id = sc.next();int idx = getIndex(list, id);if (idx != -1) {System.out.println("請輸入要修改的學生姓名");String newName = sc.next();System.out.println("請輸入要修改的學生age");int newAge = sc.nextInt();System.out.println("請輸入要修改的學生地址");String newAddress = sc.next();list.set(idx, new Student(id, newName, newAge, newAddress));System.out.println("修改成功");}else{System.out.println("不存在該id");}}public static void queryStudent(ArrayList<Student> list) {System.out.println("進入查詢學生板塊");if(list.isEmpty()) {System.out.println("無學生信息");return;  //注意得有這個}Scanner sc = new Scanner(System.in);System.out.println("請輸入要查詢的學生的id");String id = sc.next();//最好是遍歷,不過如果都是按照順序來的話應該也可以進行一個越界判斷然后輸出for (int i = 0; i < list.size(); i++) {if(id.equals(list.get(i).getId())) {Student querystu = list.get(i);System.out.println("id\t姓名\t年齡\t住址");System.out.println(querystu.getId() + "\t" + querystu.getName() + "\t" + querystu.getAge() + "\t" + querystu.getAddress());return;}}System.out.println("沒有要查詢的學生信息");//return; point 如果是void 不需要最后的return}public static boolean contains(ArrayList<Student> list, String id) {//循環遍歷得到每一個學生對象//拿到學生對象后,獲取id進行判斷for (int i = 0; i < list.size(); i++) {if(list.get(i).getId().equals(id)) {return true;}}return false;}//這塊可以直接調用下面的 getIndex>=0就是true//對應輸入id的索引public static int getIndex(ArrayList<Student> list, String id) {int idx = 0;for (int i = 0; i < list.size(); i++) {Student stu = list.get(i);String stuId = stu.getId();//查詢到的id和要刪除id進行比較if(stuId.equals(id)) {idx = i;return idx;}}return -1;  //point必須得在這寫個返回,就-1就行}}

注意點(循環檢驗,查找滿足某條件的對象是否存在)

注意:getIndex可以替代contains,有就是對應索引,沒有就是-1
必須得遍歷結束后再return false,不能for不滿足直接returnfalse
經典結構:while(true){ if(滿足條件)break; else{continue;}} 這樣可以循環,直至滿足條件
也可以用flag,loop,exit(0)終止循環

2 綜合練習2:學生管理系統升級版

加入了登錄,注冊和忘記密碼三個板塊

User類

package StudentSystem;public class User {private String name;private String password;private String personID;private String phoneNumber;public User() {}public User(String name, String password, String personID, String phoneNumber) {this.name = name;this.password = password;this.personID = personID;this.phoneNumber = phoneNumber;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPersonID() {return personID;}public void setPersonID(String personID) {this.personID = personID;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}
}

App

package StudentSystem;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class App {public static void main(String[] args) {ArrayList<User> list = new ArrayList<>();Scanner sc = new Scanner(System.in);boolean flag = true;while (flag) {System.out.println("------歡迎來到學生管理系統------");System.out.println("1.登錄");System.out.println("2.注冊");System.out.println("3.忘記密碼");System.out.println("4.退出");System.out.println("請輸入你的選擇:");int choice = sc.nextInt();switch (choice) {case 1 -> logIn(list);case 2 -> register(list);case 3 -> forgetPassword(list);case 4 -> {System.out.println("退出系統,再見");flag = false;//return;  //如果程序不是循環運行的,在這return一下就行}default -> System.out.println("沒有這個選項");}}}public static void logIn(ArrayList<User> list){System.out.println("進入登錄板塊");Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++ ) {//1.鍵盤錄入用戶名System.out.println("請輸入用戶名");String username = sc.next();//檢測用戶名是否存在boolean check = contains(list, username);if (!check) {System.out.println("用戶名"+username+"不存在,請先注冊");return;}//2.鍵盤錄入密碼System.out.println("請輸入密碼");String password = sc.next();//3.鍵盤錄入驗證碼while (true) {String rightcode = getCode();System.out.println("驗證碼為" + rightcode);System.out.println("請輸入驗證碼");String code = sc.next();if(code.equalsIgnoreCase(rightcode)){ //point 忽略大小寫System.out.println("驗證碼正確");break;}else{System.out.println("驗證碼錯誤");continue;}}//4.驗證用戶名和密碼是否正確//檢測是否在集合中//point 封裝思想的應用//point 把一些零散的數據,封裝成一個對象User userInfo = new User(username,password,null,null);boolean checkcheckUserInfo = checkUserInfo(list,userInfo);if (checkcheckUserInfo) {System.out.println("登錄成功,可以使用");break;}else{System.out.println("登錄失敗,用戶名或者密碼錯誤");if(i == 2){System.out.println("當前賬號"+username+"被鎖定");return;}else{System.out.println("登錄失敗,用戶名或者密碼錯誤,還剩下"+(2-i)+"次機會");}}}}private static boolean checkUserInfo(ArrayList<User> list, User userInfo) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);if(user.getName().equals(userInfo.getName()) && user.getPassword().equals(userInfo.getPassword())){return true;}}return false;}public static void register(ArrayList<User> list){System.out.println("進入注冊板塊");//在外部聲明變量String username= null; //point 初始化避免報錯String password= null;String personID= null;String phoneNumber= null;//添加用戶信息到集合中//1.鍵盤錄入添加用戶名以及判斷限制Scanner sc = new Scanner(System.in);boolean flag = true;while (flag) {System.out.println("請輸入用戶名");username = sc.next();//point 先驗證格式是否正確,再驗證是否唯一//1.1 用戶名長度3-15位之間//1.2 不能是純數字,需要是數字加字母//1.3 用戶名唯一boolean checkUsername = checkUsername(username);//到這里判斷用戶名格式是否正確,接著才能判斷是否唯一if(!checkUsername){System.out.println("格式不正確,請重新輸入");continue; //point 善于使用continue!!}//走到這一步,因為有continue,已經保證了格式正確System.out.println("格式正確,驗證id是否唯一");boolean flag2 = contains(list, username);if(flag2){System.out.println("用戶名重復,請重新輸入");continue;} else{System.out.println("id唯一,用戶名"+username+"可用");flag = false;   //或者外層設為true,這里直接break}}System.out.println("用戶名設置成功,請輸入密碼");//鍵盤錄入添加密碼以及判斷限制while (true) {password = sc.next();System.out.println("請再次輸入密碼");String againPassword = sc.next();if(password.equals(againPassword)){System.out.println("兩次密碼一致");break;}else{System.out.println("兩次密碼不一致,請重新輸入密碼");continue;}}System.out.println("密碼設置成功,請輸入身份證號碼");//鍵盤錄入身份證號碼以及判斷限制//長度為18位//不能0開頭//前17位必須是數字//最后一位可以是數字,也可以是大寫X或者小寫xwhile (true) {System.out.println("請輸入身份證號碼");personID = sc.next();boolean flag2 = checkPersonID(personID);if(!flag2){continue;}else{System.out.println("身份證號碼設置成功");break;}}System.out.println("身份證號碼設置成功,請輸入手機號");//鍵盤錄入手機以及判斷限制//長度為11位//不能0開頭//必須是數字while (true) {System.out.println("請輸入手機號");phoneNumber = sc.next();boolean flag3 = checkPhoneNumber(phoneNumber);if(flag3){System.out.println("手機號設置成功");break;}}//把輸入正確的內容放到用戶對象中list.add(new User(username,password,personID,phoneNumber));System.out.println("注冊成功");printList(list);}public static void forgetPassword(ArrayList<User> list){System.out.println("進入忘記密碼板塊");Scanner sc = new Scanner(System.in);//1.鍵盤錄入用戶名System.out.println("請輸入用戶名");String username = sc.next();boolean checkUsername = contains(list,username);if(checkUsername){System.out.println("存在此用戶");}else{System.out.println("用戶名"+username+"不存在,請先注冊");return;}//2.鍵盤錄入身份證和手機號System.out.println("請輸入身份證");String personID = sc.next();System.out.println("請輸入手機號");String phoneNumber = sc.next();//驗證身份證和手機號User checkUser = new User(username,null,personID,phoneNumber);int index = findIndex(list, checkUser.getName());User findUser = list.get(index);if(findUser.getPersonID().equalsIgnoreCase(checkUser.getPersonID()) && //point 可以Ingore,排除掉大小寫X的影響findUser.getPhoneNumber().equals(checkUser.getPhoneNumber())){System.out.println("身份證或手機號驗證正確");}else{System.out.println("身份證和手機號輸入錯誤");return;}//已經驗證了身份證和手機號,可以開始修改密碼String newPassword = null;while (true) {System.out.println("請輸入新密碼");newPassword = sc.next();System.out.println("請再次輸入新密碼");String newPassword2 = sc.next();if(newPassword.equals(newPassword2)){System.out.println("兩次密碼一致,有效");break;}else{System.out.println("兩次密碼不一致,重新輸入");continue;}}//修改密碼list.get(index).setPassword(newPassword); //善于使用get方法System.out.println("密碼修改成功");}private static int findIndex(ArrayList<User> list, String name) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);if (user.getName().equals(name)) {return i;}}return -1;}private static void printList(ArrayList<User> list) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);System.out.println(user.getName()+","+user.getPassword()+","+user.getPersonID()+","+user.getPhoneNumber());}}private static boolean checkPhoneNumber(String phoneNumber) {//長度為11位if(phoneNumber.length() != 11){System.out.println("手機號不是11位,請重新輸入");return false;}//不能0開頭char firstNumber = phoneNumber.charAt(0);if(firstNumber == '0'){System.out.println("手機號不能為0開頭,請重新輸入");return false;}//必須是數字for (int i = 0; i < phoneNumber.length(); i++) {char ch = phoneNumber.charAt(i);if(!(ch >= '0' && ch <= '9')){System.out.println("手機號存在非數字,請重新輸入");return false;}}return true;}private static boolean checkPersonID(String personID) {//長度為18位if(personID.length() != 18){System.out.println("身份證不是18位,請重新輸入");return false;} else{System.out.println("身份證滿足18位,繼續檢驗");}//不能0開頭char firstChar = personID.charAt(0);if(firstChar == '0'){System.out.println("身份證首位為0,請重新輸入");return false;}else{System.out.println("身份證首位滿足不為0,繼續檢驗");}//前17位必須是數字for (int i = 0; i < personID.length() - 1 ; i++) { //前17位,長度-1就行char ch = personID.charAt(i);if(!(ch <= '9' && ch >= '0')){System.out.println("前17位存在非數字,請重新輸入");return false;}}//最后一位可以是數字,也可以是大寫X或者小寫xchar lastChar = personID.charAt(personID.length() - 1);if(!(lastChar <= '9' && lastChar >= '0') || (lastChar == 'X') || (lastChar == 'x')){System.out.println("最后一位輸入有問題,請重新輸入");return false;}else{return true;}}public static boolean checkUsername(String username){//1.1 用戶名長度3-15位之間//if (username.length() < 3 || username.length() > 15) //point 這樣寫調用兩次有點復雜int len = username.length(); //多寫一步可讀性高,調用一次效率提升if(len < 3 || len > 15){return false;}//1.2 不能是純數字,需要是數字加字母//循環遍歷int cnt = 0;for (int i = 0; i < username.length(); i++) {char ch = username.charAt(i);if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {cnt++;break; //有一個字母就不用繼續遍歷了}}//if(cnt == 0){//    return false;//}return cnt > 0;}public static boolean contains(ArrayList<User> list, String username){for (int i = 0; i < list.size(); i++) {User u = list.get(i);if (u.getName().equals(username)) {return true;}}//必須得遍歷結束后再return falsereturn false; //list為空默認可以}public static String getCode(){//生成驗證碼//1.創建一個包含所有字母的集合或者stringbuilderArrayList<Character> list = new ArrayList<>();for (int i = 0; i < 26; i++) {list.add((char) ('a' + i));list.add((char) ('A' + i));}//挑選隨機字母//point 可以隨機生成五個,其中一個用數字覆蓋StringBuilder sb = new StringBuilder();Random r = new Random();for (int i = 0; i < 4; i++) {int index = r.nextInt(list.size());sb.append(list.get(index));}//挑選隨機數字int number = r.nextInt(10);sb.append(number); //注意這一步//調整字符串中的內容,可以把字符串先變為一個字符數組,// 然后調整字符數組里面的數據,最后再把字符數組變為字符串char[] arr = sb.toString().toCharArray();int randomIndex = r.nextInt(arr.length);char temp = arr[randomIndex];arr[randomIndex] = arr[arr.length - 1];arr[arr.length - 1] = temp;return new String(arr);}
}

封裝思想

把一些零散的數據,封裝成一個對象,傳入或者傳出,會更加高效

多寫一步可讀性高

if (username.length() < 3 || username.length() > 15) {...}//point 這樣寫調用兩次有點復雜//多寫一步可讀性高,調用一次效率提升
int len = username.length(); 
if(len < 3 || len > 15){...}

如何調整字符串中內容

1.substring,適用于已知移動到哪里
2.把字符串先變為一個字符數組,然后調整字符數組里面的數據,最后再把字符數組變為字符串

其他注意點

str.equalsIgnoreCase忽略大小寫比較,驗證碼和身份證最后一位都可以用得到
整個方法內都要用到的變量不要在循環里聲明+初始化(只在循環里初始化也會報錯的其實),可以外部聲明,初始化一個空值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92677.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ddos 放在多個云主機,同時運行

1. 起因&#xff0c; 目的: 我打開 grok, 被 cloudflare 攔截&#xff0c;問我是不是機器人。 這個情況&#xff0c;如果是別的小網站也就算了&#xff0c;很正常。 大公司也搞這種東西&#xff0c;要么是偷懶&#xff0c;要么是太小氣了。 一氣之下&#xff0c;我決定寫個 ddo…

lspci/setpci用法小結

目錄 1.lspci用法小結 2.lspci -t 3.setpci用法小結 1.lspci用法小結 參考博客&#xff1a;【PCIe】lspci用法小結 - 知乎 lspci是一個用來顯示系統中所有PCI總線設備或者連接到該總線上所有設備的工具 man lspci lspci(8) …

光通信從入門到精通:PDH→DWDM→OTN 的超詳細演進筆記

光通信從入門到精通&#xff1a;PDH→DWDM→OTN 的超詳細演進筆記 作者&#xff1a; 脫脫克克 日期&#xff1a;2025-07-24 關鍵詞&#xff1a;DWDM、OTN、G.709、光纖、帶寬、C-band、L-band、DSP、ROADM 摘要 本文用一條“高速公路”的比喻&#xff0c;把 40 年光傳輸技術演進…

安全初級——網頁

網頁代碼<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用戶登錄</title><script src&…

JVM原理及其機制(二)

目錄 一 . 垃圾回收機制&#xff08;GC&#xff09; 二 . 垃圾回收的具體步驟 &#xff08;1&#xff09;先找出誰是垃圾 方案一&#xff1a;引用計數 方案二&#xff1a;可達性分析 &#xff08;2&#xff09;釋放垃圾的內存空間 方案一&#xff1a;標記清除 方案二…

Solo:基于 zkHE 的身份驗證協議,構建 Web3 可信匿名身份層

“Solo 正在基于其獨創的 zkHE 架構&#xff0c;構建一套“可信匿名”的鏈上身份系統&#xff0c;有望打破長期困擾 Web3 的“不可能三角”&#xff0c;即在隱私保護、身份唯一性與去中心化可驗證性之間實現兼得。”前不久&#xff0c;Web3 身份層項目 Solo 宣布完成 120 萬美元…

【Excel函數】將數據非空的字段篩選出來放在新列

一、需求描述 將對應數據不為空的字段篩選出來放在新的列里 二、解析 IFERROR(INDEX(B$2:B$10,SMALL(IF(C$2:C$10<>"",ROW(C$2:C$10)-ROW(C$2)1),ROW(A1))),"") 1. IF(C$2:C$10<>"", ROW(C$2:C$10)-ROW(C$2)1) 作用&#xff1a;…

【unity游戲開發入門到精通——組件篇】unity的粒子系統力場 (Particle System Force Field)實現如旋風、吸引力、風吹效果等

文章目錄前言一、參數介紹二、Particle System Force Field 的核心特性三、如何使用1、粒子系統開啟外力選項2、然后再添加粒子系統力場 (Particle System Force Field)即可參考專欄推薦完結前言 Unity的粒子系統是一個非常強大的工具&#xff0c;可以用來創建各種動態效果&am…

JS逆向基礎( AES 解密密文WordArray和Uint8Array實戰②)

1. Uint8Array 就像「快遞柜」 每個格子固定放「1 瓶飲料」(1 字節 = 8 位,范圍 0-255 就像飲料編號) 比如裝了 3 瓶:可樂(編號 255)、雪碧(10)、礦泉水(0) 這是超市通用的標準貨架,任何工具(JS 內置功能)都認識這種擺放方式 用途:運輸、存儲所有二進制東西(圖片…

論文閱讀:《針對多目標優化和應用的 NSGA-II 綜述》一些關于優化算法的簡介

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

Elasticsearch(ES)安裝

docker下安裝ES 拉取鏡像docker pull elasticsearch:7.4.0 創建文件夾 權限賦值 chmod -R 777 /usr/local/docker/es 創建配置 #可訪問IP http.host: 0.0.0.0 # 跨域 http.cors.enabled: true http.cors.allow-origin: "*" 編寫腳本并賦權 首先先返回上一級目錄&…

Pycharm、Python安裝及配置小白教程

本篇博客主要介紹了如何使用工具軟件快速安裝Pycharm和Python并完成基礎配置。 目錄 一、Python與Pycharm是什么&#xff1f; 二、安裝工具軟件 三、安裝Python 四、安裝Pycharm 五、配置Pycharm 1. 基礎設置 2. 配置解釋器 一、Python與Pycharm是什么&#xff1f; …

Redis數據庫入門教程

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的高性能鍵值存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。本教程將帶你從零開始全面學習Redis&#xff0c;涵蓋基礎概念、安裝配置、數據結構、持久化機制以及與Python的交互等內容…

工業儀表識別(一)環境安裝

儀表識別環境安裝 &#xff11;&#xff0e;cuda cuda 11.8 intall&#xff08;cuda11.8、cuda12.6按照需求安裝&#xff09; ref: https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第三十四課——車牌識別的FPGA實現(6)疊加車牌識別的信息

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

Windows上用于跨平臺開發的環境工具

1. MSYS2&#xff08;Minimal SYStem 2&#xff09; 一款模擬Unix環境的軟件&#xff0c;可以執行unix命令。通過pacman管理工具&#xff0c;類似Ubuntu上apt-get&#xff0c;RedHat中的yum。 MSYS2最大好處就是能夠在Windows上輕松編譯一些由Unix環境工具鏈開發的工程&#…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-15,(知識點:DC-DC電源,BUCK電路,鐵損,銅損)

目錄 1、題目 2、解答 選項 A 選項 B 選項 C 選項 D 3、相關知識點 一、紋波 二、感量&#xff08;電感量L&#xff09; 三、開關頻率f 四、鐵損 五、銅損 題目匯總版&#xff1a; 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持…

Ethereum: 從 1e+21 到千枚以太幣:解密 Geth 控制臺的余額查詢

大家好今天&#xff0c;我們來聊一個新手在接觸以太坊節點時經常會遇到的場景。想象一下&#xff0c;我們成功運行了一個私有以太坊節點&#xff0c;并嘗試查詢一個賬戶的余額&#xff0c;然后我們看到了這樣一個返回結果&#xff1a;1e21。 這是什么意思&#xff1f;是出錯了&…

2025最新軟件測試面試八股文(含答案+文檔)

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 1、什么是POM&#xff0c;為什么要使用它&#xff1f;POM是Page Object Model的簡稱&#xff0c;它是一種設計思想&#xff0c;而不是框架。大概的意思是&#xff…

表格數據處理-TabNet模型使用說明(模型構建+SHAP)

一、模型介紹 論文為《TabNet: Attentive Interpretable Tabular Learning》發表于2021年&#xff0c;屬于Google Cloud AI。該研究針對表格數據提出了一種新的深度神經網絡&#xff08;DNN&#xff09;架構TabNet&#xff0c;旨在解決傳統深度學習在表格數據上表現不如決策樹模…