文章目录

  • (一)编程实现
    • 1、创建名片实体类
    • 2、创建名片管理类
      • (1)创建主菜单
      • (2)创建登录方法
      • (3)创建名片管理方法
      • (4)创建添加名片方法
      • (5)创建保存名片方法
      • (6)创建读取名片文件方法
      • (7)创建查询名片方法
      • (8)创建修改名片方法
      • (9)创建删除名片方法
  • (二)知识点讲解
    • 1、数组列表
    • 2、文件读写
  • (三)拓展练习
    • 任务:实现图书增删改查功能
  • 实现可进可退的多级菜单系统
  • 功能:添加名片、查询名片、修改名片、删除名片、保存名片、读取名片
  • 要求:数据要持久化保存到磁盘上

(一)编程实现

1、创建名片实体类

  • net.huawei.p03.t07包里创建Card实体类
  • 运行程序,查看结果
public class Card {private String id;private String name;private String workUnit;private String post;private String telephone;/*** 无参构造方法*/public Card() {}/*** 有参构造方法* * @param id* @param name* @param workUnit* @param post* @param telephone*/public Card(String id, String name, String workUnit, String post, String telephone) {this.id = id;this.name = name;this.workUnit = workUnit;this.post = post;this.telephone = telephone;}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 String getWorkUnit() {return workUnit;}public void setWorkUnit(String workUnit) {this.workUnit = workUnit;}public String getPost() {return post;}public void setPost(String post) {this.post = post;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}@Overridepublic String toString() {return "Card{" +"id='" + id + '\'' +", name='" + name + '\'' +", workUnit='" + workUnit + '\'' +", post='" + post + '\'' +", telephone='" + telephone + '\'' +'}';}
}

2、创建名片管理类

  • net.huawei.p03.t07包里创建CardManagement

(1)创建主菜单

public class CardManagement {public static void main(String[] args) {// 声明部分int mc1;Scanner sc = new Scanner(System.in);boolean isRunning = true; // 循环控制变量while (isRunning) {// 绘制一级菜单System.out.println("  名片管理系统");System.out.println("================");System.out.println("   1. 登录");System.out.println("   0. 退出");System.out.println("================");System.out.print("输入菜单编号[1,0]:");mc1 = sc.nextInt();// 根据用户选择进行相应的操作switch (mc1) {case 1:// 调用登录方法login();break;case 0:System.out.println("谢谢使用~再见~");isRunning = false; // 结束循环break;default:System.out.println("输入的菜单编号有误!");}}}
}
  • 程序报错,因为在菜单项1里要调用的登录方法login()尚未定义

(2)创建登录方法

CardManagement类里创建login()方法

/**                                                                    * 登录方法                                                                */
private static void login() {                                          String username, password;                                         Scanner sc = new Scanner(System.in);                               System.out.print("用户名:");                                          username = sc.next();                                              System.out.print("密  码:");                                         password = sc.next();                                              if (username.equals("howard") && password.equals("903213")) {      System.out.println("登录成功~");                                   // 调用名片管理方法                                                    cardManagement();                                              } else {                                                           System.out.println("用户名或密码有误,登录失败~");                          }
}

-程序报错,因为在login()方法要调用的名片管理方法cardManagement()尚未定义

(3)创建名片管理方法

  • CardManagemen类里创建cardManagement()方法
/**
* 名片管理方法
*/
private static void cardManagement() {                                       int mc2;                                                                 Scanner sc = new Scanner(System.in);                                     boolean isRunning = true; // 循环控制变量                                      while (isRunning) {                                                      // 绘制二级菜单                                                            System.out.println("=======名片管理========");                           System.out.println("     1. 添加名片");                                  System.out.println("     2. 修改名片");                                  System.out.println("     3. 查询名片");                                  System.out.println("     4. 删除名片");                                  System.out.println("     5. 读取名片");                                  System.out.println("     6. 保存名片");                                  System.out.println("     7. 返回上级");                                  System.out.println("=======================");                       System.out.print("输入菜单编号[1,2,3,4,5,6,7]:");                          mc2 = sc.nextInt();                                                  switch (mc2) {                                                       case 1:                                                          System.out.println("执行添加名片功能~");                             break;                                                       case 2:                                                          System.out.println("执行修改名片功能~");                             break;                                                       case 3:                                                          System.out.println("执行查询名片功能~");                             break;                                                       case 4:                                                          System.out.println("执行删除名片功能~");                             break;                                                       case 5:                                                          System.out.println("读取名片文件到名片数组列表~");                        break;                                                       case 6:                                                          System.out.println("将名片数组列表写入名片文件~");                        break;                                                       case 7:                                                          isRunning = false; // 结束二级菜单循环                               break;                                                       default:                                                         System.out.println("输入的菜单编号有误!");                            }                                                                    }
}
  • 现在一个可进可退的菜单系统我们就做好了,可以简单测试一下

(4)创建添加名片方法

  • CardManagement类里创建addCard()方法

  • 思路:输入名片信息,基于名片信息构建名片对象,将名片对象添加到名片数组列表

  • 在类的声明部分创建名片列表对象(思考为什么要这样做)
    ![在

  • 编写addCard()方法代码

/**                                                            * 添加名片方法                                                      */
private static void addCard() {                                // 声明变量                                                    String id;                                                 String name;                                               String workUnit;                                           String post;                                               String telephone;                                          Scanner sc = new Scanner(System.in);                       // 输入名片信息                                                  System.out.print("编号:");                                   id = sc.next();                                            System.out.print("姓名:");                                   name = sc.next();                                          System.out.print("单位:");                                   workUnit = sc.next();                                      System.out.print("职位:");                                   post = sc.next();                                          System.out.print("手机:");                                   telephone = sc.next();                                     // 创建名片对象                                                  Card card = new Card(id, name, workUnit, post,telephone);  // 将名片对象添加名片数组列表                                           cards.add(card);
}
  • 修改cardManagement()方法,需要调用addCard()方法

  • 运行程序,测试效果

(5)创建保存名片方法

  • CardManagement类里创建saveCards()方法

  • 思路:遍历名片数组列表,将每一个名片对象的属性拼接成一个有分隔符的字符串,写入名片文件

/**                                                      * 保存名片到文件                                               */
private static void saveCards() {                        try {                                                // 创建文件字符输出流                                     FileWriter fw = new FileWriter("cards.txt");     // 用增强for循环遍历名片数组列表                              for (Card card : cards) {                        // 输出名片对象                                    System.out.println(card);                    // 创建名片字符串缓冲对象                               StringBuffer buffer = new StringBuffer();    // 添加名片字段信息(空格作为分隔符)                         buffer.append(card.getId() + " ");           buffer.append(card.getName() + " ");         buffer.append(card.getWorkUnit() + " ");     buffer.append(card.getPost() + " ");         buffer.append(card.getTelephone());          // 将名片信息写入名片文件(必须添加换行符)                      fw.write(buffer.toString() + "\n");          }                                                // 关闭文件字符输出流                                     fw.close();                                      // 提示用户写入成功                                      System.out.println("恭喜,名片数据成功写入文件~");            } catch (IOException e) {                            e.printStackTrace();                             }
}
  • 对每一个名片对象都会写入磁盘文件,这个方法不好,需要优化的,将所有名片数据分行放到一个字符串缓冲对象里,这样只需要写一次磁盘文件,效率就提高了。
/**                                                               * 保存名片到文件                                                        */
private static void saveCards() {                                 try {                                                         // 创建文件字符输出流                                              FileWriter fw = new FileWriter("cards.txt");              // 创建名片容器字符串缓冲对象                                          StringBuffer cardsBuffer = new StringBuffer();            // 用增强for循环遍历名片数组列表                                       for (Card card : cards) {                                 // 输出名片对象                                             System.out.println(card);                             // 创建名片字符串缓冲对象                                        StringBuffer buffer = new StringBuffer();             // 添加名片字段信息(空格作为分隔符)                                  buffer.append(card.getId() + " ");                    buffer.append(card.getName() + " ");                  buffer.append(card.getWorkUnit() + " ");              buffer.append(card.getPost() + " ");                  buffer.append(card.getTelephone());                   // 将名片信息添加到名片容器字符串缓冲对象                                cardsBuffer.append(buffer.toString() + "\n");         }                                                         // 将名片容器字符串缓冲对象里的数据写入文件                                   fw.write(cardsBuffer.toString());                         // 关闭文件字符输出流                                              fw.close();                                               // 提示用户写入成功                                               System.out.println("恭喜,名片数据成功写入文件~");                     } catch (IOException e) {                                     e.printStackTrace();                                      }
}
  • 修改cardManagement()方法,添加调用saveCards()方法

(6)创建读取名片文件方法

  • CardManagement类里创建readCardFile()方法

  • 思路:行读取名片文件,把每行数据按空格拆分名片字段信息,基于名片字段信息创建名片对象,然后将每个名片对象添加到名片数组列表

  • 先把名片文件读取出来

  • 运行程序,查看结果

  • 读取名片文件的完整代码

/**                                                                                             * 读取名片文件,保存到名片数组列表                                                                             */
private static void readCardFile() {                                                            try {                                                                                       // 创建文件字符输入流                                                                            FileReader fr = new FileReader("cards.txt");                                            // 创建缓冲字符输入流                                                                            BufferedReader br = new BufferedReader(fr);                                             // 定义行变量                                                                                String nextLine = "";                                                                   // 通过循环读取名片文件                                                                           while ((nextLine = br.readLine()) != null) {                                            // 拆分行字符串得到字段数组                                                                     String[] fields = nextLine.split(" ");                                              // 基于有参构造方法创建名片对象                                                                   Card card = new Card(fields[0], fields[1], fields[2], fields[3], fields[4]);        // 将名片对象添加到名片数组列表                                                                   cards.add(card);                                                                    // 提示用户添加成功                                                                         System.out.println("添加" + card + "到名片数组列表~");                                       }                                                                                       // 关闭缓冲字符输入流                                                                            br.close();                                                                             // 关闭文件字符输入流                                                                            fr.close();                                                                             } catch (FileNotFoundException e) {                                                         System.err.println("温馨提示:名片文件不存在~");                                                    } catch (IOException e) {                                                                   e.printStackTrace();                                                                    }
  • 修改cardManagement()方法,添加调用readCardFile()方法

(7)创建查询名片方法

  • CardManagement类里创建findCard()方法

  • 思路:我们可以再做一个子菜单,包含两个选项:按编号查询按姓名查询,但是我们不想再做子菜单,让用户输入待查的编号和姓名,这样会有四种情况:输入的编号和姓名全为空字符串,此时查询全部名片;输入的编号不为空字符串但是姓名为空字符串,此时按编号查询名片;输入的编号为空字符串但是姓名不为空字符串,此时按姓名查询;输入的编号和姓名都不为空字符串,此时按编号和姓名查询名片。

/**                                                                                       * 查询名片方法                                                                                 */
private static void findCard() {                                                          String id, name;                                                                      Scanner sc = new Scanner(System.in);                                                  System.out.print("编号:");                                                              id = sc.nextLine(); // 单行输入,敲回车确认                                                     System.out.print("姓名:");                                                              name = sc.nextLine(); // 单行输入,敲回车确认                                                   // 判断用户按哪种方式查询名片                                                                      if (id.equals("")) {                                                                  if (name.equals("")) { // 查询全部名片                                                  // 遍历名片数组列表                                                                   for (Card card : cards) {                                                     System.out.println(card.getId() + " "                                     + card.getName() + " " + card.getWorkUnit() + " "                 + card.getPost() + " " + card.getTelephone());                    }                                                                             } else { // 按姓名查询名片                                                               System.out.println("~按姓名查询名片~");                                              boolean found = false;                                                        // 遍历名片数组列表,按姓名来找                                                             for (Card card : cards) {                                                     if (card.getName().equals(name)) {                                        found = true; // 找到了                                                  break;                                                                }                                                                         }                                                                             // 根据found值提示用户                                                               if (found) {                                                                  // 针对可能存在的同名情况                                                            for (Card card : cards) {                                                 if (card.getName().equals(name)) {                                    System.out.println(card.getId() + " "                             + card.getName() + " " + card.getWorkUnit() + " "         + card.getPost() + " " + card.getTelephone());            }                                                                     }                                                                         } else {                                                                      System.out.println("温馨提示:查无此人~");                                         }                                                                             }                                                                                 } else {                                                                              if (name.equals("")) { // 按编号查询名片                                                 System.out.println("~按编号查询名片~");                                              boolean found = false;                                                        // 遍历名片数组列表,按编号来找                                                             for (Card card : cards) {                                                     if (card.getId().equals(id)) {                                            found = true; // 找到了                                                  // 输出名片信息                                                             System.out.println(card.getId() + " "                                 + card.getName() + " " + card.getWorkUnit() + " "             + card.getPost() + " " + card.getTelephone());                break; // 跳出循环                                                        }                                                                         }                                                                             // 根据found值提示用户                                                               if (!found) {                                                                 System.out.println("温馨提示:查无此人~");                                         }                                                                             } else { // 按编号和姓名查询名片                                                            System.out.println("~按编号和姓名查询名片~");                                           boolean found = false;                                                        // 遍历名片数组列表,按编号和姓名来找                                                          for (Card card : cards) {                                                     if (card.getId().equals(id) && card.getName().equals(name)) {             found = true; // 找到了                                                  // 输出名片信息                                                             System.out.println(card.getId() + " "                                 + card.getName() + " " + card.getWorkUnit() + " "             + card.getPost() + " " + card.getTelephone());                break; // 跳出循环                                                        }                                                                         }                                                                             // 根据found值提示用户                                                               if (!found) {                                                                 System.out.println("温馨提示:查无此人~");                                         }                                                                             }                                                                                 }
}
  • 修改cardManagement()方法,添加调用findCard()方法

  • 测试名片中有同名的情况,修改cards.txt

  • 运行程序,测试效果

(8)创建修改名片方法

  • CardManagement类里创建modifyCard()方法

  • 思路:按编号查询到名片之后,可以对每个字段进行修改,如果该字段没有输入非空值,那么表明该字段不做任何修改

/**                                                                                               * 修改名片方法                                                                                         */
private static void modifyCard() {                                                                String id, name, workUnit, post, telephone;                                                   Scanner sc = new Scanner(System.in);                                                          boolean found = false;                                                                        System.out.print("输入待修改者编号:");                                                                id = sc.nextLine();                                                                           // 遍历名片列表数组                                                                                   for (Card card : cards) {                                                                     if (card.getId().equals(id)) {                                                            found = true; // 找到了                                                                  // 输出名片信息                                                                             System.out.println(card.getId() + " "                                                 + card.getName() + " " + card.getWorkUnit() + " "                             + card.getPost() + " " + card.getTelephone());                                break; // 跳出循环                                                                        }                                                                                         }                                                                                             // 判断是否找到名片                                                                                   if (found) {                                                                                  System.out.println("说明:不输入信息,直接敲回车,表明不修改字段值");                                            System.out.print("姓名:");                                                                  name = sc.nextLine();                                                                     System.out.print("单位:");                                                                  workUnit = sc.nextLine();                                                                 System.out.print("职务:");                                                                  post = sc.nextLine();                                                                     System.out.print("手机:");                                                                  telephone = sc.nextLine();                                                                // 采用传统for循环遍历名片数组列表                                                                      for (int i = 0; i < cards.size(); i++) {                                                  // 获取名片对象                                                                             Card card = cards.get(i);                                                             if (card.getId().equals(id)) { // 按编号找到名片                                             // 根据用户输入修改名片对象                                                                   if (!name.equals("")) {                                                           card.setName(name);                                                           }                                                                                 if (!workUnit.equals("")) {                                                       card.setWorkUnit(workUnit);                                                   }                                                                                 if (!post.equals("")) {                                                           card.setPost(post);                                                           }                                                                                 if (!telephone.equals("")) {                                                      card.setTelephone(telephone);                                                 }                                                                                 // 用修改后的名片对象去更新名片数组列表对应的元素                                                        cards.set(i, card);           // 显示修改的数组列表对应元素                  System.out.println(cards.get(i));                                                     break; // 跳出循环                                                                    }                                                                                     }                                                                                         } else {                                                                                      System.out.println("温馨提示:查无此人~");                                                         }
}
  • 修改cardManagement()方法,添加调用modifyCard()方法

(9)创建删除名片方法

  • CardManagement类里创建deleteCard()方法

  • 修改cardManagement()方法,添加调用deleteCard()方法

(二)知识点讲解

1、数组列表

  • 数组列表ArrayList的类层次结构图

  • 数组数组列表ArrayList的类图

  • ArrayList是List接口的实现类

  • ArrayList的常用方法:add()、remove()、set()、get()

2、文件读写

(三)拓展练习

任务:实现图书增删改查功能

【Java面向对象编程——名片管理系统】相关推荐

  1. java面向对象编程基础

    java面向对象编程基础 前言:什么是java 是咖啡飘香的清晨 - 是斯坦福校园意浓情深 - 是James的思想睿智 是剁手党双十一挥舞的利刃 是大数据云计算驰骋的平台 - 是ATM上吐出的钞票 - ...

  2. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

  3. Java面向对象编程篇6——注解与反射

    Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...

  4. Java面向对象编程篇5——枚举

    Java面向对象编程篇5--枚举 1.枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2.枚举的定义 使用 ...

  5. Java面向对象编程篇4——内部类

    Java面向对象编程篇4--内部类 1.内部类的概念 当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类 (Inner),而这个内部类所在的类叫做外部类(Outer). 类中的内容:成员变 ...

  6. Java面向对象编程篇3——接口与抽象类

    Java面向对象编程篇3--接口与抽象类 1.接口(interface) 接口中可以含有变量和方法.但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是pub ...

  7. Java面向对象编程篇2——面向对象三大特点

    Java面向对象编程篇2--面向对象三大特点 1.封装 1.1.封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生 ...

  8. Java面向对象编程篇1——类与对象

    Java面向对象编程篇1--类与对象 1.面向过程 1.1.概念 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 1.2.优缺点 优点:性 ...

  9. 【Java】《Java面向对象编程的三大特性》阅读笔记

    前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...

最新文章

  1. Apple苹果公司组织架构
  2. 排序学习之---快速排序
  3. 使用云祺虚拟机备份软件恢复Citrix XenServer 虚拟机
  4. 物联网架构成长之路(3)-EMQ消息服务器了解
  5. mysql修改密码的三种方式
  6. MyBatis Mapper Demo
  7. 利用 AVDictionary 配置参数
  8. Windows终端利器Cmder
  9. mui案例:导航栏 颜色渐变
  10. 重大变动:OpenCV拟更改授权协议!
  11. openwrt拦截snmp报文
  12. pcm转换在线工具_律师必备的PDF在线转换工具,推荐5款,全免费!
  13. 怎样呵护友谊_我不善于经营友情,有好的开始却没有好的友谊,怎样建设友情呢?...
  14. 程序员必须知道的一些事
  15. 最棒的10款MySQL GUI工具
  16. Linux下怎么进入波浪线目录,linux 波浪线 ~ 使用方法
  17. XXE漏洞详解与利用
  18. 水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如:1^3+5^3+3^3=153
  19. B_随笔_关于网站记录(2)
  20. Mac OS 下的解压缩软件——The Unarchiver

热门文章

  1. 支付宝个人收款解决方案之支付宝签约方案
  2. 【学习笔记】OFDM中信道估计技术分析与实现
  3. oepncv 移动目标追踪, 背景消除法,MOG,KNN
  4. SCI审稿流程(转)
  5. 埃森哲大连java面试_埃森哲软件工程师面试经验
  6. 清明时节——《荒原的呼唤》选载之三
  7. 关于生产环境跨域问题
  8. 选择生物竞赛的专业,未来就业情况如何?
  9. 超简单EventBus使用
  10. Centos 7安装 shutter 截图软件