思路:
一、分析用戶管理功能模塊
- User類型屬性值設定
private String username; // 用戶id(唯一字段)
private String nickname; // 昵稱
private String password; // 密碼
private int age; // 年齡
- 實現用戶數據(通過 UserManager 類進行 User 對象的數據管理)的“增刪改查”功能;
增加用戶: add(user User):void
刪除功能: delete(username String):void
修改用戶: update(user User):void
查詢數據: load(user User):User
- 實現用戶登錄功能;
登錄功能: login(username String,password String):void
UML圖示:
二、創建User類和UserManager類
- User 類中只包含私有的 User 屬性,並用 setter 方法和 getter 方法進行封裝;
- UserManager 類包含上述的自定義方法,用於實現用戶數據的“增刪改查”操作;
思考:
在 UserManager 類中,需要存儲 n 多一個User類型的數據,則可以在該類中 new 一個 User 類型的數組,即:User[] users;
數組的長度是未知的,如果直接在該類中定義死了,則這個系統的靈活性就降低了(無論如何只能用初始定義好的數組大小,后期需要擴容的時候面臨需要修改源代碼的煩惱)。因此可以考慮如果想增加數組的靈活性,能不能在main函數中管理者自己定義一個數組大小呢?答案是可以的,可以使用 UserManager 的構造方法來設定 users 數組的大小,即:
public class UserManager( int size ) {
users = new User[size];
}
三、UserManager 類中各個功能模塊的業務邏輯思路
1、load( String username ) 方法
實現通過參數 username 在整個數組中尋找到相應的數組元素,並返回該數組元素(User 對象);
通過 for 循環遍歷數組,在循環體中:將每次遍歷的數組元素和參數 username 進行 equals 比較:
- 如果比較值為真,則表示找到了該 username 對應的數組元素,返回該遍歷的數組;
- 如果整個遍歷完了都沒有找到,則在循環語句之后進行null值返回,因為 load() 方法返回值類型為 User 。
注意:
如果這個數組的長度(size)是 5 ,數組中目前只有三條記錄,那么遍歷的時候就只需要遍歷到這有記錄的三條即可。
那怎么讓for循環遍歷的時候只遍歷到當前數據記錄的最后一條的位置呢?
我們可以人為的定義一個“標記”,這個標記用來表示,數組存到哪里,就指到哪里,為后期需要增加/刪除新的元素操作做鋪墊;
比如:
users = new User[10]; //默認初始的5個數組內存中都是null,此時遍歷元素值為 null 的數組元素沒有任何意義。
當user[0] 中增加了一條數據,我們就讓“標記”記錄一條,此時標記累計值為 1 ;
當user[1] 中再增加一條數據,我們就讓“標記”再記錄一條,此時標記累計值為 2;
……
當user[8 中再增加一條數據,我們就讓“標記”再記錄一條,此時標記累計值為 9;
當user[9] 中再增加一條數據,我們就讓“標記”再記錄一條,此時標記累計值為 10;
如果是刪除數據,則是相類似的規律。nums 的值表示共存了 nums 個用戶數據,而數組中依次存在 user[0] , user[1] , … ,user[nums-1] 當中。
由此可以得出:標記的增加/減少與數組元素的下標值有關,因此可以人為設定一個 int 類型的 nums 變量,這個變量默認值為 0 ,放置到 UserManager 類的屬性值中,只要創建了 UserManager 類的實例,就進行默認初始化。
因此查詢數組中的所有元素,就只需要遍歷 nums 次,每次得到該次“標記”對應的數組元素即可。
2、add( User user ) 方法
用戶數據信息的增加首先需要考慮的問題是:
- 數組剩余內存空間的多少,如果數組元素滿員了,則需要提示管理者不可以再添加新的用戶數據;
- username 關鍵字的唯一性,因此需要判斷現有的數組元素中是否存在重復數據的問題,如果數據重復(關鍵字重疊),則需要提示數據已存在,不可以添加。
如果上述問題條件都沒有發生,則表示新增的用戶數據是全新的數據,並且數組內存中有“位置”將其添加。
實現思路:
// 剩余空間判斷
本數組的長度(length)為 size,只需要判斷“標記”(用 nums 標記數組內存中存了多少個有效的元素值)和數組長度的大小。
nums 只要大於或者等於數組長度則提示不可以再增加數據記錄。
// 數據唯一性判斷
可以通過load方法進行判斷,讓參數 user 對象的 username 屬性值在 loa() 方法里進行搜索,如果搜索到的是一個 null 值則表示新增的數據沒有和當前的數據庫中的記錄重復。
// 添加數據記錄
將數據存至 user[nums] 當中,並讓 nums 自增 1 即可。
【拓展】通過指定位置增加數組元素,見圖:
3、update( User user ) 方法
update() 方法的實現思路與添加功能相似:
首先判斷參數 user 是否在數組中存在,如果不存在則提示“要更新的原始數據不存在!”;
其次在上一個步驟中,已經找出了該需要更新的數據位置,直接將user的屬性值利用 users 數組的 setter() 方法進行修改。
4、delete( String username ) 方法
刪除數組元素操作思路見下圖:
代碼:
User 類
1 package com.test.test01; 2 3 public class User { 4 private String username; 5 private String nickname; 6 private String password; 7 private int age; 8 9 public String getUsername() { 10 return username; 11 } 12 public void setUsername(String username) { 13 this.username = username; 14 } 15 public String getNickname() { 16 return nickname; 17 } 18 public void setNickname(String nickname) { 19 this.nickname = nickname; 20 } 21 public String getPassword() { 22 return password; 23 } 24 public void setPassword(String password) { 25 this.password = password; 26 } 27 public int getAge() { 28 return age; 29 } 30 public void setAge(int age) { 31 this.age = age; 32 } 33 34 public User(String username, String password, String nickname, int age) { 35 super(); 36 this.username = username; 37 this.nickname = nickname; 38 this.password = password; 39 this.age = age; 40 } 41 42 @Override 43 public String toString() { 44 return "User [username=" + username + ", nickname=" + nickname 45 + ", password=" + password + ", age=" + age + "]"; 46 } 47 48 }
UserManager 類
1 package com.test.test01; 2 3 public class UserManager { 4 User[] users; 5 private int nums=0; 6 7 8 public UserManager(int size) { 9 users = new User[size]; 10 } 11 12 public void add(User user) { 13 //判斷數組內存是否有剩余 14 if(nums>=users.length) { 15 System.out.println("對不起,用戶數據內存已滿,無法再添加"+user.getUsername()+"信息!"); 16 return; 17 } 18 19 //判斷是否存在該用戶數據 20 User u = this.load(user.getUsername()); 21 if(u!=null) { 22 System.out.println("對不起,該用戶:"+u.getUsername()+"數據已存在!"); 23 return; 24 } 25 26 //添加數據 27 users[nums] = user; 28 nums++; 29 System.out.println("用戶:"+user.getUsername()+"數據已添加成功!"); 30 return; 31 32 } 33 34 public User load(String username) { 35 for(int i=0;i<nums;i++) { 36 User u = users[i]; 37 if(username.equals(u.getUsername())) { 38 return u; 39 } 40 } 41 return null; 42 } 43 44 public void delete(String username) { 45 int index=-1; 46 //通過index索引找到需要刪除的數組下標值 47 for(int i=0;i<nums;i++) { 48 User u = users[i]; 49 if(username.equals(u.getUsername())) { 50 index=i; 51 break; 52 } 53 } 54 55 if(index==-1) { 56 System.out.println("對不起,要刪除的用戶:"+username+"不存在!"); 57 return; 58 } 59 60 //從index位置開始,后一個數組元素賦值到前一個數組元素中,最后再將users[nums]=null,nums自減 61 for(int i=index+1;i<nums;i++) { 62 users[i-1] = users[i]; 63 } 64 users[nums-1]=null; 65 nums--; 66 System.out.println("用戶:"+username+"數據刪除成功!"); 67 return; 68 69 } 70 71 public void add(int pos,User user) { 72 //首先檢查pos是否合法 73 if(pos<0||pos>=nums) { 74 System.out.println("對不起,用戶"+user.getUsername()+"信息添加位置不正確!"); 75 return; 76 } 77 78 //判斷pos是否可以插入,即nums個數據已經存滿了就不可以再增加新數據 79 if(nums>=users.length) { 80 System.out.println("對不起,內存已滿,無法再添加"+user.getUsername()+"信息!"); 81 return; 82 } 83 84 //檢查是否已存在user對象 85 User u = this.load(user.getUsername()); 86 if(u!=null) { 87 System.out.println("對不起,該用戶:"+u.getUsername()+"數據已存在!"); 88 return; 89 } 90 91 for(int i=nums;i>pos;i--) { 92 //前面有nums>=users.length判斷,因此users[nums]空間存在,可以被前面的元素賦值 93 users[i] = users[i-1]; 94 } 95 96 users[pos] = user; 97 nums++; 98 System.out.println("用戶:"+user.getUsername()+"數據已添加成功!"); 99 return; 100 } 101 102 public void update(User user) { 103 //檢查是否存在該用戶數據 104 User u = this.load(user.getUsername()); 105 if(u==null) { 106 System.out.println("對不起,該用戶:"+user.getUsername()+"數據不存在!"); 107 return; 108 } 109 110 //更新數據 111 u.setNickname(user.getNickname()); 112 u.setPassword(user.getPassword()); 113 u.setAge(user.getAge()); 114 System.out.println("用戶:"+user.getUsername()+"數據已更新成功!"); 115 return; 116 } 117 118 public void login(String username,String password) { 119 //判斷是否存在 username 用戶名 120 User u = this.load(username); 121 122 if(u==null) { 123 System.out.println("用戶名:"+username+"不正確,請檢查輸入!"); 124 return; 125 } 126 127 //判斷密碼是否正確 128 if(!password.equals(u.getPassword())) { 129 System.out.println("密碼不正確,請檢查輸入!"); 130 return; 131 } 132 //成功登錄系統 133 System.out.println("歡迎"+username+"登錄系統!"); 134 return; 135 } 136 137 public User[] list() { 138 User[] tus = new User[nums]; //只遍歷數組元素中存有有效元素值的數組 139 for(int i=0;i<nums;i++) { 140 tus[i] = users[i]; 141 } 142 return tus; 143 } 144 }
TestUser 測試入口
1 package com.test.test01; 2 3 public class TestUser { 4 5 public static void main(String[] args) { 6 UserManager um = new UserManager(5); 7 um.add(new User("zs","123","張三",24)); //添加信息成功 8 um.add(new User("ls","123","李四",22)); //添加信息成功 9 um.add(new User("ls","123","李四",23)); //添加不成功,已存在 10 um.add(new User("ww","123","王五",21)); //添加信息成功 11 um.add(new User("zl","123","趙六",21)); //添加信息成功 12 um.add(new User("zq","123","朱七",22)); //添加信息成功 13 14 um.add(new User("S","123","大S",22)); //滿員了,添加信息不成功 15 16 System.out.println("------分割線------"); 17 18 um.delete("ls"); //刪除ls 19 um.delete("ls1231"); //提示要刪除的用戶名不存在 20 21 System.out.println("------分割線------"); 22 23 um.update(new User("S","1234","大S",23)); //提示要更新的用戶名不存在 24 um.update(new User("zq","1234","朱七",23)); //提示zq信息更新成功 25 26 System.out.println("------分割線------"); 27 28 um.login("zs1", "1234"); //提示用戶名錯誤 29 um.login("zs1", "123412"); //提示用戶名錯誤 30 um.login("zs", "123412"); //提示密碼錯誤 31 um.login("zs", "123"); //提示成功登陸系統 32 33 um.login("ls", "123"); //用戶名不存在,提示錯誤 34 35 System.out.println("------分割線------"); 36 37 User[] u = um.list(); 38 for(int i=0;i<u.length;i++) { 39 System.out.println(u[i]); 40 } 41 42 System.out.println("------分割線------"); 43 44 um.add(1,new User("S","123","大S",22)); 45 um.delete("ww"); 46 um.add(1,new User("Y","123","大Y",22)); 47 um.delete("Y"); 48 um.add(3,new User("s","123","小S",22)); 49 50 System.out.println("------分割線------"); 51 52 User[] u2 = um.list(); 53 for(int i=0;i<u2.length;i++) { 54 System.out.println(u2[i]); 55 } 56 } 57 58 }