使用数组制作简易的用户管理系统【java】
思路:
一、分析用户管理功能模块
- 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 类
 package com.test.test01;
 public class User {
     private String username;
     private String nickname;
     private String password;
     private int age;
     public String getUsername() {
         return username;
     }
     public void setUsername(String username) {
         this.username = username;
     }
     public String getNickname() {
         return nickname;
     }
     public void setNickname(String nickname) {
         this.nickname = nickname;
     }
     public String getPassword() {
         return password;
     }
     public void setPassword(String password) {
         this.password = password;
     }
     public int getAge() {
         return age;
     }
     public void setAge(int age) {
         this.age = age;
     }
     public User(String username, String password, String nickname, int age) {
         super();
         this.username = username;
         this.nickname = nickname;
         this.password = password;
         this.age = age;
     }
     @Override
     public String toString() {
         return "User [username=" + username + ", nickname=" + nickname
                 + ", password=" + password + ", age=" + age + "]";
     }
 }
UserManager 类
 package com.test.test01;
 public class UserManager {
     User[] users;
     private int nums=0;
     public UserManager(int size) {
         users = new User[size];
     }
     public void add(User user) {
         //判断数组内存是否有剩余
         if(nums>=users.length) {
             System.out.println("对不起,用户数据内存已满,无法再添加"+user.getUsername()+"信息!");
             return;
         }
         //判断是否存在该用户数据
         User u = this.load(user.getUsername());
         if(u!=null) {
             System.out.println("对不起,该用户:"+u.getUsername()+"数据已存在!");
             return;
         }
         //添加数据
         users[nums] = user;
         nums++;
         System.out.println("用户:"+user.getUsername()+"数据已添加成功!");
         return;
     }
     public User load(String username) {
         for(int i=0;i<nums;i++) {
             User u = users[i];
             if(username.equals(u.getUsername())) {
                 return u;
             }
         }
         return null;
     }
     public void delete(String username) {
         int index=-1;
         //通过index索引找到需要删除的数组下标值
         for(int i=0;i<nums;i++) {
             User u = users[i];
             if(username.equals(u.getUsername())) {
                 index=i;
                 break;
             }
         }
         if(index==-1) {
             System.out.println("对不起,要删除的用户:"+username+"不存在!");
             return;
         }
         //从index位置开始,后一个数组元素赋值到前一个数组元素中,最后再将users[nums]=null,nums自减
         for(int i=index+1;i<nums;i++) {
             users[i-1] = users[i];
         }
         users[nums-1]=null;
         nums--;
         System.out.println("用户:"+username+"数据删除成功!");
         return;
     }
     public void add(int pos,User user) {
         //首先检查pos是否合法
         if(pos<0||pos>=nums) {
             System.out.println("对不起,用户"+user.getUsername()+"信息添加位置不正确!");
             return;
         }
         //判断pos是否可以插入,即nums个数据已经存满了就不可以再增加新数据
         if(nums>=users.length) {
             System.out.println("对不起,内存已满,无法再添加"+user.getUsername()+"信息!");
             return;
         }
         //检查是否已存在user对象
         User u = this.load(user.getUsername());
         if(u!=null) {
             System.out.println("对不起,该用户:"+u.getUsername()+"数据已存在!");
             return;
         }
         for(int i=nums;i>pos;i--) {
             //前面有nums>=users.length判断,因此users[nums]空间存在,可以被前面的元素赋值
             users[i] = users[i-1];
         }
         users[pos] = user;
         nums++;
         System.out.println("用户:"+user.getUsername()+"数据已添加成功!");
         return;
     }
     public void update(User user) {
         //检查是否存在该用户数据
         User u = this.load(user.getUsername());
         if(u==null) {
             System.out.println("对不起,该用户:"+user.getUsername()+"数据不存在!");
             return;
         }
         //更新数据
         u.setNickname(user.getNickname());
         u.setPassword(user.getPassword());
         u.setAge(user.getAge());
         System.out.println("用户:"+user.getUsername()+"数据已更新成功!");
         return;
     }
     public void login(String username,String password) {
         //判断是否存在 username 用户名
         User u = this.load(username);
         if(u==null) {
             System.out.println("用户名:"+username+"不正确,请检查输入!");
             return;
         }
         //判断密码是否正确
         if(!password.equals(u.getPassword())) {
             System.out.println("密码不正确,请检查输入!");
             return;
         }
         //成功登录系统
         System.out.println("欢迎"+username+"登录系统!");
         return;
     }
     public User[] list() {
         User[] tus = new User[nums];    //只遍历数组元素中存有有效元素值的数组
         for(int i=0;i<nums;i++) {
             tus[i] = users[i];
         }
         return tus;
     }
 }
TestUser 测试入口
 package com.test.test01;
 public class TestUser {
     public static void main(String[] args) {
         UserManager um = new UserManager(5);
         um.add(new User("zs","123","张三",24));    //添加信息成功
         um.add(new User("ls","123","李四",22));    //添加信息成功
         um.add(new User("ls","123","李四",23));    //添加不成功,已存在
         um.add(new User("ww","123","王五",21));    //添加信息成功
         um.add(new User("zl","123","赵六",21));    //添加信息成功
         um.add(new User("zq","123","朱七",22));    //添加信息成功
         um.add(new User("S","123","大S",22));    //满员了,添加信息不成功
         System.out.println("------分割线------");
         um.delete("ls");    //删除ls
         um.delete("ls1231");    //提示要删除的用户名不存在
         System.out.println("------分割线------");
         um.update(new User("S","1234","大S",23));    //提示要更新的用户名不存在
         um.update(new User("zq","1234","朱七",23));    //提示zq信息更新成功
         System.out.println("------分割线------");
         um.login("zs1", "1234");    //提示用户名错误
         um.login("zs1", "123412");    //提示用户名错误
         um.login("zs", "123412");    //提示密码错误
         um.login("zs", "123");        //提示成功登陆系统
         um.login("ls", "123");    //用户名不存在,提示错误
         System.out.println("------分割线------");
         User[] u = um.list();
         for(int i=0;i<u.length;i++) {
             System.out.println(u[i]);
         }
         System.out.println("------分割线------");
         um.add(1,new User("S","123","大S",22));
         um.delete("ww");
         um.add(1,new User("Y","123","大Y",22));
         um.delete("Y");
         um.add(3,new User("s","123","小S",22));
         System.out.println("------分割线------");
         User[] u2 = um.list();
         for(int i=0;i<u2.length;i++) {
             System.out.println(u2[i]);
         }
     }
 }
使用数组制作简易的用户管理系统【java】的更多相关文章
- 什么是二维数组?二维遍历?Java二维数组制作图片迷宫 使用如鹏游戏引擎制作窗口界面 附带压缩包下载,解压后双击start.bat启动
		什么是二维数组? 数组当中放的还是数组 int [][] arr=new int[3][2]; 有3个小箱子,每个箱子2个格子. 看结果? int [][] arr=new int[3][2]; Sy ... 
- 简易用户管理系统-前端实现(表单&提交请求&button$基础)
		laravel框架编写简易用户管理系统,前端Layui框架. 1.动态生成列表项 实现效果 PHP后台传入用户对象($users). 前端页面接收数据传入table. 逻辑就是在生成表格时,遍历传来的 ... 
- Django 小实例S1 简易学生选课管理系统 3 创建用户模型(model)
		Django 小实例S1 简易学生选课管理系统 第3节--创建用户模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新 ... 
- 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫
		前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ... 
- JDBC MySQL 实例之  用户管理系统
		1 Java 和 MySQL 怎么建立连接 2 通过Java怎么对数据库进行操作 package day01; import java.sql.Connection; import java.sql. ... 
- 使用react全家桶制作博客后台管理系统  网站PWA升级  移动端常见问题处理  循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi  [Abp 源码分析]四、模块配置  [Abp 源码分析]三、依赖注入
		使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ... 
- 原生Js_制作简易日历
		javascript制作简易日历,月份信息已经放在一个数组中,在<script>...</script>中编写代码实现其功能 实现步骤 a) 获取需要操作的dom对象 b) 在 ... 
- Django 小实例S1 简易学生选课管理系统 8 CSS样式优化
		Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ... 
- Django 小实例S1 简易学生选课管理系统 7 修改个人信息
		Django 小实例S1 简易学生选课管理系统 第7节--修改个人信息 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 用户模块除了注册登录之外,还 ... 
随机推荐
- abaqus的umat在vs中debug调试
			配置参考:https://www.jishulink.com/content/post/333909 常见错误:http://blog.sina.com.cn/s/blog_6116bc050100e ... 
- 二叉树/DFS总结
			二叉搜索树(Binary Search Tree,又名排序二叉树,二叉查找树,通常简写为BST)定义如下: 空树或是具有下列性质的二叉树: ()若左子树不空,则左子树上所有节点值均小于或等于它的根节点 ... 
- 工程无法正常调试运行unknown failure at android.os.Binder.execTransact
			同事正常使用的工程,放到另电脑上,开后可以正常编译,但是无法安装调试到手机上,始终提示错误 新建一个工程正常. 最后通过把开发工具升级到最新版本解决. 
- DAO和service的解释
			转自:http://blog.sina.com.cn/s/blog_4b1452dd0102wvox.html 我们都知道有了Hibernate后,单独对数据的POJO封装以及XML文件要耗损掉一个类 ... 
- CentOS 6下升级Python版本
			CentOS6.8默认的python版本是2.6,而现在好多python组件开始只支持2.7以上的版本,比如说我今天遇到的pip install pysqlite,升级python版本是一个痛苦但又常 ... 
- 使用tcpdump探测TCP/IP三次握手
			读计算机应该就同说过TCP/IP三次握手,但是都没有去验证过,今天心血来潮,去验证了一下,于是乎写下了这篇博客,可能写的可能有问题,还请多多指教 包括我学习,还有从很多资料来看资料,第三次握手,应该会 ... 
- python列表和字符串的三种逆序遍历方式
			python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ... 
- CUDA 计算线程索引的一般公式
			CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y) + blockIdx.y ... 
- 个人对于angularjs依赖注入的理解
			依赖注入(Dependency Injection,DI),作者认为本文中所有名词性的"依赖" 都可以理解为 "需要使用的资源". 对象或者函数只有以下3种获取 ... 
- ASCII、Unicode、UTF-8以及Python3编码问题
			编码问题,其实的确是个很烦人的问题,一开始觉得不需要看,到后来出现问题,真的是抓狂, 而像我们这些刚刚涉及到这些问题的小白来说,更是无从下手,所以查阅资料,总结理解下各个概念以及Python3的编码问 ... 
