20231211_091928 java 案例 名片管理系统 3102班

目标

名片管理系统

功能




定义一个系统类

提供一个开始方法
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);

    }

优化 更新操作存在的问题

表头不打印

在这里插入图片描述

无数据不执行修改操作

在这里插入图片描述

防止用户的非法输入
期望用户输入编号
但是防止用户输入非数字与越界的数字

在这里插入图片描述

后续
删除操作可能存在问题,需要同样的处理

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸鱼编程pyhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值