# 簡單互動式管理系統 - ArrayList增刪改查的應用 ###### tags: `Java` `Basic Java` ## 首先建立一個domain的資料夾,裡面放入Java Bean 通常Java Bean都放在domain裡統一管理 將屬性參數都設定private後,直接用IDE自動生成getter & setter ``` package domain; public class Student { private String id; private String name; private int age; private String birthday; public Student() { } public Student(String id, String name, int age, String birthday) { this.id = id; this.name = name; this.age = age; this.birthday = birthday; } 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 getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public String toString() { return "Student{id = " + id + ", name = " + name + ", age = " + age + ", birthday = " + birthday + "}"; } } ``` ## 主程式部分 幾個重點: 1. 選項有限,故使用switch case進行選單操作 2. 因為要重複跟user提取其輸入的數字,故需要用while來實現 ``` public static void main(String[] args) { // 建立一個arraylist以存放data 資料成員是學生類別 ArrayList<Student> studentList = new ArrayList<>(); Scanner sc = new Scanner(System.in); // 使用while(true)迴圈讓scanner能夠重複執行 while (true) { System.out.println("*** Welcome To The System ***"); System.out.println("Please Enter a Number: "); System.out.println("1. Add a Entry"); System.out.println("2. Delete a Entry"); System.out.println("3. Edit a Entry"); System.out.println("4. Show All Entries"); System.out.println("5. Leave System"); int choice = sc.nextInt(); switch (choice) { case 1: addEntries(studentList); break; case 2: deleteEntries(studentList); break; case 3: editEntries(studentList); break; case 4: queryEntries(studentList); break; case 5: System.out.println("Thank you and Goodbye!"); System.exit(0); break; default: System.out.println("Invalid Input. Please Try Again!"); break; } } } ``` ## 增刪改查:各自寫成方法方便維護與管理 為防止任意使用,故將成員方法都用private修飾 ### 新增: ``` private static void addEntries(ArrayList<Student> studentList) { // 參數宣告初始化 String inputID = ""; Scanner sc = null; // 判斷重複資料 // 跟user要求資料,若查詢到重覆值則繼續要求輸入,故使用while(true)迴圈,脫離迴圈的方式是查不到存放資料的arraylist中的數據(也就是回傳index為-1) while (true) { sc = new Scanner(System.in); System.out.println("Please Enter Student ID: "); inputID = sc.next(); // 調用getIndex的方法 int index = getIndex(inputID, studentList); if (index == -1) { break; } System.out.println("ID was occupied. Please Re-enter A New ID.\n"); } // 登錄資料 System.out.println("Please Enter Student Name: "); String inputName = sc.next(); System.out.println("Please Enter Student Age: "); int inputAge = sc.nextInt(); System.out.println("Please Enter Student Birthday: "); String inputBirthday = sc.next(); // 登錄資料存進參數,然後用學生類的constructor生成學生物件 // 再放入arraylist當中 Student stu = new Student(inputID, inputName, inputAge, inputBirthday); studentList.add(stu); System.out.println("Added Successfully."); } ``` ### 修改: ``` private static void editEntries(ArrayList<Student> studentList) { Scanner sc = new Scanner(System.in); System.out.println("Please Enter an ID to be Edited: "); // 使用index查找資料,若返回-1則代表沒找到 String input = sc.next(); // 調用getIndex的方法 int index = getIndex(input, studentList); if (index == -1) { System.out.println("Entry not Found. Please Re-enter.\n"); } else { // take user input System.out.println("Please Enter A New ID: "); String newID = sc.next(); System.out.println("Please Enter A New Name: "); String newName = sc.next(); System.out.println("Please Enter A New Age: "); int newAge = sc.nextInt(); System.out.println("Please Enter A New Birthday"); String newBirthday = sc.next(); // Edit new info with user input /* method 1 studentList.get(index).setId(newID); studentList.get(index).setName(newName); studentList.get(index).setAge(newAge); studentList.get(index).setBirthday(newBirthday); */ // method 2 Student stu = new Student(newID, newName, newAge, newBirthday); studentList.set(index, stu); System.out.println("Edited Successfully.\n"); } } ``` ### 查詢: ``` public static void queryEntries(ArrayList<Student> studentList) { // 一開始都沒有建立資料的時候查找會是0 if (studentList.size() == 0) { System.out.println("No Entries Found. Please Enter Information.\n"); } else { // 有資料後,就把所有資料都印出來 System.out.println("ID\tName\tAge\tBirthday"); for (int i = 0; i < studentList.size(); i++) { Student stu = studentList.get(i); System.out.print(stu.getId() + "\t"); System.out.print(stu.getName() + "\t"); System.out.print(stu.getAge() + "\t"); System.out.print(stu.getBirthday() + "\t"); System.out.println(); } System.out.println("\n"); } } ``` ### 刪除: ``` public static void deleteEntries(ArrayList<Student> studentList) { Scanner sc = new Scanner(System.in); System.out.println("Please Enter an ID to be Deleted: "); String input = sc.next(); // 調用getIndex方法尋找資料 int index = getIndex(input, studentList); if (index == -1) { System.out.println("Entry not Found. Please Re-enter.\n"); } else { // 找到就進行remove studentList.remove(index); System.out.println("Removed Successfully.\n"); } } ``` ### 取得index的方法 由於新增、修改與刪除都需要取得學生資料在陣列中的位置,故需要另外做一個getIndex的方法,傳入學生ID與學生list,返回index,沒找到就返回-1 ``` public static int getIndex(String id, ArrayList<Student> studentList) { for (int i = 0; i < studentList.size(); i++) { Student stu = studentList.get(i); if (stu.getId().equals(id)) { return i; } } return -1; } ``` ### Source Code ``` package org.example; import domain.Student; import java.util.ArrayList; import java.util.Scanner; public class Test { public static void main(String[] args) { ArrayList<Student> studentList = new ArrayList<>(); // testing data /* Student stu1 = new Student("001", "John", 25, "1999-01-01"); Student stu2 = new Student("002", "Wick", 30, "1988-12-12"); studentList.add(stu1); studentList.add(stu2); */ Scanner sc = new Scanner(System.in); while (true) { System.out.println("*** Welcome To The System ***"); System.out.println("Please Enter a Number: "); System.out.println("1. Add a Entry"); System.out.println("2. Delete a Entry"); System.out.println("3. Edit a Entry"); System.out.println("4. Show All Entries"); System.out.println("5. Leave System"); int choice = sc.nextInt(); switch (choice) { case 1: addEntries(studentList); break; case 2: deleteEntries(studentList); break; case 3: editEntries(studentList); break; case 4: queryEntries(studentList); break; case 5: System.out.println("Thank you and Goodbye!"); System.exit(0); break; default: System.out.println("Invalid Input. Please Try Again!"); break; } } } private static void addEntries(ArrayList<Student> studentList) { String inputID = ""; Scanner sc = null; while (true) { sc = new Scanner(System.in); System.out.println("Please Enter Student ID: "); inputID = sc.next(); int index = getIndex(inputID, studentList); if (index == -1) { break; } System.out.println("ID was occupied. Please Re-enter A New ID.\n"); } System.out.println("Please Enter Student Name: "); String inputName = sc.next(); System.out.println("Please Enter Student Age: "); int inputAge = sc.nextInt(); System.out.println("Please Enter Student Birthday: "); String inputBirthday = sc.next(); Student stu = new Student(inputID, inputName, inputAge, inputBirthday); studentList.add(stu); System.out.println("Added Successfully."); } private static void editEntries(ArrayList<Student> studentList) { Scanner sc = new Scanner(System.in); System.out.println("Please Enter an ID to be Edited: "); String input = sc.next(); int index = getIndex(input, studentList); if (index == -1) { System.out.println("Entry not Found. Please Re-enter.\n"); } else { // take user input System.out.println("Please Enter A New ID: "); String newID = sc.next(); System.out.println("Please Enter A New Name: "); String newName = sc.next(); System.out.println("Please Enter A New Age: "); int newAge = sc.nextInt(); System.out.println("Please Enter A New Birthday"); String newBirthday = sc.next(); // Edit new info with user input /* method 1 studentList.get(index).setId(newID); studentList.get(index).setName(newName); studentList.get(index).setAge(newAge); studentList.get(index).setBirthday(newBirthday); */ /* method 2 */ Student stu = new Student(newID, newName, newAge, newBirthday); studentList.set(index, stu); System.out.println("Edited Successfully.\n"); } } public static void deleteEntries(ArrayList<Student> studentList) { Scanner sc = new Scanner(System.in); System.out.println("Please Enter an ID to be Deleted: "); String input = sc.next(); int index = getIndex(input, studentList); if (index == -1) { System.out.println("Entry not Found. Please Re-enter.\n"); } else { studentList.remove(index); System.out.println("Removed Successfully.\n"); } } public static int getIndex(String id, ArrayList<Student> studentList) { for (int i = 0; i < studentList.size(); i++) { Student stu = studentList.get(i); if (stu.getId().equals(id)) { return i; } } return -1; } public static void queryEntries(ArrayList<Student> studentList) { if (studentList.size() == 0) { System.out.println("No Entries Found. Please Enter Information.\n"); } else { System.out.println("ID\tName\tAge\tBirthday"); for (int i = 0; i < studentList.size(); i++) { Student stu = studentList.get(i); System.out.print(stu.getId() + "\t"); System.out.print(stu.getName() + "\t"); System.out.print(stu.getAge() + "\t"); System.out.print(stu.getBirthday() + "\t"); System.out.println(); } System.out.println("\n"); } } } ```