目标
名片管理系统
功能
增
删
改
查
定义一个系统类
提供一个开始方法
start
定义一个测试类
实例化系统类
让系统启动
关注控制台的输出
明确程序的结构
程序启动后我们主要是做三件事情
1,欢迎用户
2,询问用户需求
3,根据用户需求启动对应的功能
编写对应的方法
在start方法中编写上述的三个方法
经验
快速的跳转到方法定义的地方
按住ctrl不松手,鼠标移动到方法名的位置,点一下
回到上一步的操作
ctrl + alt + 左
技巧
如果我们的代码中需要某个功能
可以先调用它,直接把方法名()先写出来
再定义它的,按住alt+回车,选择create method xxx
三个方法的调用
三个方法的定义
改造getUserChoice方法
之前的仅仅只是输出
现在需要让它接收用户的选择
并且返回用户的选择结果
修改了方法定义的地方后
还需要修改一下调用的地方
因为这个方法会有返回值
所以我们接收一下
优化runApp方法
接收用户的输入数据
根据用户输入的内容不同
会执行不同的任务
优化分支结构 每个分支调用一个方法
方法的详情
实现功能循环
前面的功能只能执行一次
加上功能循环
加上一些显示样式
即可
添加名片功能分析
手机通讯录的重要数据
姓名
电话
备注
每一个用户都会记录三个数据
通讯录中会有多个用户
我们可以定义一个名片类
具有三个属性:
姓名name
电话phone
备注msg
如果添加一个名片
就是要实例化一个名片对象
并给名片对象赋值
如果通讯录中有五个用户
如何保存?
对象集合 ArrayList
添加名片的本质
就是往对象集合中添加一个名片对象
定义名片类
新建一个java类文件
public class Card {
// 姓名
private String name;
// 电话
private String phone;
// 备注
private String msg;
// 提供公有的方法
// alt + ins 选择 getter and setter
// 全选所有的属性,一路确定
// 会自动帮我们生成getxxx setxxx
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
定义名片对象集合
这个集合应该是系统类中的成员变量
只有这样子
在其它的方法中才可以使用这个集合
public class Game {
// 名片对象集合
private ArrayList<Card> cardList = new ArrayList<>();
添加名片的主逻辑
给Card类添加构造方法
提供三参构造方法
重写无参构造方法
public class Card {
// 姓名
private String name;
// 电话
private String phone;
// 备注
private String msg;
// 定义构造方法
// alt + ins 选 constructor
public Card() {
}
public Card(String name, String phone, String msg) {
this.name = name;
this.phone = phone;
this.msg = msg;
}
在addCard方法中
先接收数据
再实例化对象(用数据作参数)
再把对象添加到对象集合中
添加功能完成
显示所有名片
先定义表头
然后再输出每一个对象集合中的成员数据
private void showCard() {
// 查看名片
System.out.println("当前功能:查看名片");
// 定义一个表头
String title = "序号\t\t姓名\t\t电话\t\t\t\t备注";
// 数据格式
String fmt = "%s\t\t%s\t\t%s\t\t%s";
// 打印输出
System.out.println(title);
// 遍历对象集合
for (int i = 0; i < cardList.size(); i++) {
// 拿序号
int num = i + 1;
// 拿当前序号的对象
Card card = cardList.get(i);
// 拼字符串
String line = String.format(fmt, num, card.getName(), card.getPhone(), card.getMsg());
// 输出字符串
System.out.println(line);
}
加载数据的方法
为了让程序自带一些测试数据
我们需要有一些加载数据的方法
调用方法
public void start() {
// 加载数据
loadData();
// 欢迎用户
welcome();
定义方法
private void loadData() {
// 提前准备一些测试数据
// 添加三条用户数据
Card km = new Card("葛亮", "15912345678", "卧龙先生");
Card pt = new Card("庞统", "15311111111", "凤雏先生");
Card zl = new Card("周瑜", "18911224455", "美周朗");
this.cardList.add(km);
this.cardList.add(pt);
this.cardList.add(zl);
}
搜索名片
逻辑
private void searchCard() {
// 一般情况下会按照姓名来进行模糊搜索
// 接收用户搜索的关键词
// 遍历对象集合,找到名字中包含这个关键词的所有对象
// 把结果放到一个新的对象集合中
// 显示新的对象集合
}
主要两个步骤
private void searchCard() {
// 调用下面的搜索方法,拿到结果集
ArrayList<Card> resultList = search();
// 显示结果集
showCard(resultList);
}
步骤1,搜索符合条件的名片,返回名片对象集合
private ArrayList<Card> search() {
// 一般情况下会按照姓名来进行模糊搜索
// 定义一个结果集合,存放保存结果的
ArrayList<Card> resultList = new ArrayList<>();
// 接收用户搜索的关键词
System.out.println("请输入搜索关键字:");
String key = scanner.next(); // 亮
// 遍历对象集合,找到名字中包含这个关键词的所有对象
// [名片1,名片2,名片n]
for (Card card : cardList
) {
// 获取当前名片对象的名字
String name = card.getName();
// 判断名字中是否包含key
int idx = name.indexOf(key);
if (idx != -1) {
// 当前对象的名字中含有关键字的
// 需要把当前对象存到结果集合中
resultList.add(card);
}
}
return resultList;
}
步骤2,将名片对象集合传给显示列表方法
private void showCard(ArrayList<Card> list) {
// 查看名片
System.out.println("当前功能:查看名片");
// 定义一个表头
String title = "序号\t\t姓名\t\t\t电话\t\t\t\t备注";
// 数据格式
String fmt = "%s\t\t%s\t\t\t%s\t\t%s";
// 打印输出
System.out.println(title);
// 遍历对象集合
for (int i = 0; i < list.size(); i++) {
// 拿序号
int num = i + 1;
// 拿当前序号的对象
Card card = list.get(i);
// 拼字符串
String line = String.format(fmt, num, card.getName(), card.getPhone(), card.getMsg());
// 输出字符串
System.out.println(line);
}
}
删除功能
逻辑
private void removeCard() {
// 删除名片
// 一般情况下会从列表中删除
// 列表一般是搜索得来 [亮仔,葛亮]
// 通过列表找到最终的那个名片对象,把它从cardlist对象集合中移除即可
}
代码
private void removeCard() {
// 删除名片
System.out.println("当前功能:删除名片");
// 一般情况下会从列表中删除
// 列表一般是搜索得来 [亮仔,葛亮]
ArrayList<Card> resultList = search();
showCard(resultList);
// 通过列表找到最终的那个名片对象,把它从cardlist对象集合中移除即可
// 接收用户选择的编号
System.out.println("请输入要删除的用户的编号:");
String num = scanner.next();
// 编号-1得到下标
int idx = Integer.valueOf(num) - 1;
// 通过结果集合与下标找到对象
Card delCard = resultList.get(idx);
// 有序集合根据成员来删除数据
cardList.remove(delCard);
// 提示
System.out.println("删除数据成功:" + delCard.getName());
}
修改功能
修改名片
private void updateCard() {
System.out.println("当前功能:修改名片");
// 先找到要修改的名片对象
ArrayList<Card> resultList = search();
showCard(resultList);
// 获得要改的名片对象
System.out.println("请输入需要修改的名片编号");
String num = scanner.next();
// 根据编号获得对象
int idx = Integer.valueOf(num) - 1;
Card card = resultList.get(idx);
// 然后再改数据
System.out.println("当前用户名为【" + card.getName() + "】,请输入新的用户名:");
String newName = scanner.next();
System.out.println("当前电话为【" + card.getPhone() + "】,请输入新的电话:");
String newPhone = scanner.next();
System.out.println("当前备注为【" + card.getMsg() + "】,请输入新的备注:");
String newMsg = scanner.next();
card.setName(newName);
card.setPhone(newPhone);
card.setMsg(newMsg);
}
优化 更新操作存在的问题
表头不打印
无数据不执行修改操作
防止用户的非法输入
期望用户输入编号
但是防止用户输入非数字与越界的数字
后续
删除操作可能存在问题,需要同样的处理