修改后的Package名字为com.javaoop1
    bean包

    1. package com.javaoop1.bean;
    2. import java.util.Objects;
    3. /**
    4. * @Description: 一个快递包裹类的创建,包含快递单号,快递公司,包裹的取件码
    5. * 包含比较快递单号是相同的方法(修改了equals方法)。
    6. * @Author: XUEWEN TAN
    7. * @Date:2020。08.30
    8. * bean这个package中没有任何业务逻辑,所有属性全部私有,提供get,set方法,提供无参构造器的对象。
    9. */
    10. public class Express {
    11. //快递单号
    12. private String number;
    13. //快递公司
    14. private String company;
    15. //取件码
    16. private int code;
    17. public Express(String number, String company, int code) {
    18. this.number = number;
    19. this.company = company;
    20. this.code = code;
    21. }
    22. @Override
    23. public String toString() {
    24. return "Express{" +
    25. "number='" + number + '\'' +
    26. ", company='" + company + '\'' +
    27. ", code=" + code +
    28. '}';
    29. }
    30. @Override
    31. public boolean equals(Object o) {
    32. if (this == o) return true;
    33. if (o == null || getClass() != o.getClass()) return false;
    34. Express express = (Express) o;
    35. return Objects.equals(number, express.number);
    36. }
    37. @Override
    38. public int hashCode() {
    39. return Objects.hash(number);
    40. }
    41. public Express() {
    42. }
    43. public String getNumber() {
    44. return number;
    45. }
    46. public void setNumber(String number) {
    47. this.number = number;
    48. }
    49. public String getCompany() {
    50. return company;
    51. }
    52. public void setCompany(String company) {
    53. this.company = company;
    54. }
    55. public int getCode() {
    56. return code;
    57. }
    58. public void setCode(int code) {
    59. this.code = code;
    60. }
    61. }

    DAO包

    1. package com.javaoop1.dao;
    2. import com.javaoop1.bean.Express;
    3. import java.util.Random;
    4. /**
    5. *@Description:快递的数据的存储与取出(DAO= data access object),创建一个名为ExpressDao的类,
    6. *包含添加快递包裹,生成取件码,查找单号(遍历法),查找取件码(遍历法),update,删除快递包裹,查看所有包裹
    7. *@Author: XUEWEN TAN
    8. *@Date: 2020.08.30
    9. */
    10. public class ExpressDao {
    11. //创建一个10*10的快递柜
    12. private Express[][] data = new Express [10][];
    13. private int size; //定义size作为当前已经存储的快递数量
    14. private Random random = new Random();//定义随机数
    15. public void init(){
    16. for(int i=0;i<10;i++){
    17. data[i] = new Express[10];
    18. }
    19. }
    20. public ExpressDao(){
    21. init();
    22. }
    23. /**
    24. * 快递员添加快递包裹的方法add
    25. * @param e
    26. * @return 添加成功或者失败
    27. */
    28. public boolean add(Express e){//todo:需要判断e是否为空。
    29. if(size == 100){
    30. return false;//当存储快递数为100时即快递柜无空位
    31. }
    32. //随机生成二维数组下标
    33. int x = -1;
    34. int y = -1;
    35. while(true){
    36. x = random.nextInt(10);//生成x,y的随机坐标
    37. y = random.nextInt(10);
    38. if(data[x][y] == null){
    39. //此位置无快递
    40. break;
    41. }
    42. }
    43. //存入坐标
    44. int code =randomCode();
    45. e.setCode(code);
    46. data[x][y] = e;
    47. return true;
    48. }
    49. /**
    50. * 生成六位数取件码
    51. * @return Int类型的6位数的取件码
    52. */
    53. private int randomCode(){
    54. //100000-999999 = 0~899999+100000
    55. while(true){
    56. int code = random.nextInt(900000) + 100000;
    57. //如果查到了快递则继续生成新的取件码
    58. Express e = findCode(code);
    59. //如果没有查到,则返回生成的取件码,即取件码生成成功
    60. if (e == null) {
    61. return code;
    62. }
    63. }
    64. }
    65. /**
    66. * 查找单号-遍历法
    67. * @param number
    68. * @return 快递包裹(对象)
    69. */
    70. public Express findNumber(String number){//todo:在一开始保证入参就是正确的,避免后置校验
    71. Express e = new Express();
    72. e.setNumber(number);
    73. for(int i = 0 ;i<10;i++){
    74. for(int j = 0;j<10;j++){
    75. if (data[i][j] != null)
    76. if (e.equals(data[i][j])){
    77. return data[i][j];
    78. }
    79. }
    80. }
    81. return null;
    82. }
    83. /**
    84. * 查找取件码-遍历法,小概率事件也需考虑(比如取件码重复)
    85. * @param code
    86. * @return 快递包裹(对象)
    87. */
    88. public Express findCode(int code){
    89. for(int i = 0 ;i<10;i++){
    90. for(int j = 0;j<10;j++){
    91. if (data[i][j] != null)
    92. if (data[i][j].getCode() == code){
    93. return data[i][j];
    94. }
    95. }
    96. }
    97. return null;
    98. }
    99. /**
    100. * 实际上这个update的操作是多余的操作,为了MVC更圆润(演示数据库的实际操作)
    101. * @param oldExpress
    102. * @param newExpress
    103. */
    104. public void update(Express oldExpress,Express newExpress){
    105. delete(oldExpress);
    106. add(newExpress);
    107. }
    108. /**
    109. * 在快递柜中删除对应的快递包裹信息
    110. * @param e
    111. */
    112. public void delete(Express e){
    113. //命名循环为p
    114. p:for(int i = 0 ;i<10;i++) {
    115. for (int j = 0; j < 10; j++) {
    116. if (e.equals(data[i][j])) {
    117. data[i][j] = null;
    118. break p;
    119. }
    120. }
    121. }
    122. }
    123. /**
    124. * 查看所有快递
    125. * @return 快递柜里的所有东西
    126. */
    127. public Express[][] findAll(){
    128. return data;
    129. }
    130. }

    Main包

    1. package com.javaoop1.main;
    2. import com.javaoop1.bean.Express;
    3. import com.javaoop1.dao.ExpressDao;
    4. import com.javaoop1.view.Views;
    5. /**
    6. * @Description:Main这个类是controller模块(MVC中的C模块),包含快递柜程序的控制逻辑,
    7. * 初始化主要界面,分流快递员和取件人,即快递员界面和取件人界面
    8. * @Author:Xuewen Tan
    9. * @Date:2020.08.30
    10. */
    11. public class Main {
    12. //初始化视图对象
    13. private static Views v = new Views();
    14. //初始化dao对象
    15. private static ExpressDao dao = new ExpressDao();
    16. public static void main(String[] args){
    17. init();
    18. }
    19. /**
    20. * 初始化方法的定义
    21. */
    22. public static void init(){
    23. //1. 欢迎
    24. v.welcome();
    25. m:while(true){
    26. //2. 弹出身份选择菜单
    27. int menu = v.menu();
    28. switch (menu){
    29. case 0:
    30. break m;
    31. //主界面1选项:进入快递员界面
    32. case 1:
    33. cClient();
    34. break;
    35. //主界面2选项:进入用户界面
    36. case 2:
    37. uClient();
    38. break ;
    39. }
    40. }
    41. v.bye();
    42. }
    43. /**
    44. * 定义取件人界面的调用逻辑
    45. */
    46. public static void uClient(){//todo:判断code合理性
    47. //获得用户输入的取件码
    48. int code = v.uMenu();
    49. //取出快递
    50. Express e = dao.findCode(code);
    51. if (e == null){
    52. v.printNull();
    53. }else{
    54. v.success();
    55. v.printExpress(e);
    56. dao.delete(e);//取件人取出快递后,在快递柜中删除该包裹
    57. }
    58. }
    59. /**
    60. * 定义快递员界面的调度逻辑
    61. */
    62. public static void cClient(){
    63. while(true){
    64. int menu = v.cMenu();
    65. switch(menu){
    66. case 0:
    67. return;
    68. case 1:{//提示输入快递信息
    69. Express e = v.insert();
    70. //查询快递单号是否已经存储
    71. Express e2 = dao.findNumber(e.getNumber());
    72. //存储快递
    73. if (e2 == null){
    74. dao.add(e);
    75. v.printExpress(e);
    76. break;
    77. }else{
    78. //单号重复
    79. v.expressExist();
    80. }
    81. }
    82. break;
    83. case 2:{//快递修改
    84. //1.提示输入快递信息
    85. String number = v.findByNumber();
    86. //2.查找数据
    87. Express e =dao.findNumber(number);//todo:findExpressByNumber,避免语义歧义
    88. Express e2 = e;
    89. //3. 打印快递信息
    90. if (e == null){
    91. v.printNull();
    92. }else{
    93. v.printExpress(e);
    94. //4. 提示修改
    95. v.update(e2);
    96. dao.update(e,e2);
    97. v.printExpress(e2);
    98. }
    99. }
    100. break;
    101. case 3:{//删除快递
    102. //1.输入快递单号并查找
    103. String number = v.findByNumber();
    104. //2.查找快递对象
    105. Express e = dao.findNumber(number);
    106. if (e == null){
    107. v.printNull();
    108. }else{
    109. v.printExpress(e);
    110. int type = v.delete();
    111. if(type == 1){
    112. dao.delete(e);
    113. v.success();
    114. }
    115. }
    116. }
    117. break;
    118. //查看所有
    119. case 4:{
    120. Express[][] date = dao.findAll();//todo:改为findAllExpress
    121. v.printAll(date);
    122. }
    123. break;
    124. }
    125. }
    126. }
    127. }

    View包

    1. package com.javaoop1.view;
    2. import com.javaoop1.bean.Express;
    3. import java.util.Scanner;
    4. /**
    5. * @Description:MVC中的V模块,V视图展示(欢迎,菜单,子菜单。。。)
    6. * @Author: XUEWEN TAN
    7. * @Date: 2020.08.30
    8. */
    9. public class Views {
    10. private Scanner input = new Scanner(System.in);
    11. /**
    12. * 欢迎
    13. */
    14. public void welcome(){
    15. System.out.println("欢迎使用阿巴阿巴快递管理系统");
    16. }
    17. /**
    18. * 再见
    19. */
    20. public void bye(){
    21. System.out.println("欢迎下次使用");
    22. }
    23. /**
    24. * 主菜单(分流快递员和取件的用户
    25. * @return 使用者输入的功能选项-int
    26. */
    27. public int menu(){
    28. System.out.println("请根据提示输入功能序号");
    29. System.out.println("1. 快递管理"); //进入快递员管理界面
    30. System.out.println("2. 普通用户"); //进入用户取件界面
    31. System.out.println("0. 退出");
    32. //所有方法均使用nextLine,不会因为输入产生冲突,
    33. //还可以接收各种类型的数据。
    34. String text = input.nextLine();
    35. int num = -1;
    36. try{
    37. num = Integer.parseInt(text);
    38. }catch (NumberFormatException e){//如果有字符串的错误数据输入,需要考虑;恶意输入
    39. }
    40. if(num<0 || num>2){
    41. System.out.println("输入错误,请重新输入");
    42. return menu(); //输入数字不在有效范围内,返回菜单
    43. }
    44. return num;
    45. }
    46. /**
    47. * 快递员菜单cMenu
    48. * @return 快递输入的功能选项-int
    49. */
    50. public int cMenu(){
    51. System.out.println("请选择功能序号:");
    52. System.out.println("1. 快递录入");
    53. System.out.println("2. 快递修改");
    54. System.out.println("3. 快递删除");
    55. System.out.println("4. 查看所有快递");
    56. System.out.println("0. 退出");//以上为快递员管理界面
    57. String text = input.nextLine();
    58. int num = -1;
    59. try{
    60. //将用户输入的取件码,转换为int数据类型
    61. num = Integer.parseInt(text);
    62. }catch(NumberFormatException e){
    63. }
    64. if(num<0 || num>4){
    65. System.out.println("输入错误,请重新输入");
    66. return cMenu();
    67. }//同主界面
    68. return num;
    69. }
    70. /**
    71. * 快递员录入快递
    72. * @return 包含了快递单号和快递公司的快递对象
    73. */
    74. public Express insert(){
    75. System.out.println("请根据提示输入快递信息");
    76. System.out.println("请输入快递单号");
    77. String number = input.nextLine();
    78. System.out.println("请输入快递公司");
    79. String company = input.nextLine();
    80. Express e = new Express();
    81. e.setCompany(company);
    82. e.setNumber(number);
    83. return e;
    84. }
    85. /**
    86. * 提示快递员输入快递单号
    87. * @return 快递员输入的快递单号
    88. */
    89. public String findByNumber(){
    90. System.out.println("请根据提示输入快递信息:");
    91. System.out.println("请输入要操作的快递单号: ");
    92. String number = input.nextLine();
    93. return number;
    94. }
    95. /**
    96. * 显示快递信息
    97. * @param e
    98. */
    99. public void printExpress(Express e) {
    100. System.out.println("快递信息如下:");
    101. System.out.println("快递公司: " + e.getCompany() + ",快递单号: " + e.getNumber() + ",取件码:" + e.getCode());
    102. }
    103. /**
    104. * 修改快递信息
    105. * @param e
    106. */
    107. public void update(Express e){//todo:做个校验:e是否为空
    108. System.out.println("请输入新的快递单号");
    109. String number = input.nextLine();
    110. System.out.println("请输入新的快递公司");
    111. String company = input.nextLine();
    112. e.setNumber(number);
    113. e.setCompany(company);
    114. }
    115. /**
    116. * 询问是否确认删除
    117. * @return 1表示确认, 2表示取消操作
    118. */
    119. public int delete() {
    120. System.out.println("是否确认删除");
    121. System.out.println("1. 确认删除");
    122. System.out.println("2. 取消删除");
    123. System.out.println("0. 退出");
    124. String text = input.nextLine();
    125. int num = -1;
    126. try {
    127. num = Integer.parseInt(text);
    128. } catch (NumberFormatException e) {
    129. }
    130. if (num < 1 || num > 2) {
    131. System.out.println("输入错误,请重新输入");
    132. return delete();
    133. }
    134. return num;
    135. }
    136. /**
    137. * 给定数组的快递信息,遍历显示
    138. */
    139. public void printAll(Express[][] es){
    140. int count = 0;
    141. //通过循环,打印输出快递信息
    142. for(int i=0;i<10;i++){
    143. for(int j=0;j<10;j++){
    144. if(es[i][j] != null){
    145. count++;
    146. System.out.print("第"+(i+1)+"排"+(j+1)+"列快递");
    147. printExpress(es[i][j]);
    148. }
    149. }
    150. }
    151. if (count == 0){
    152. System.out.println("暂无快递信息");
    153. }
    154. }
    155. /**
    156. * 当查询快递无信息时的提示语
    157. */
    158. public void printNull(){
    159. System.out.println("快递不存在,请确认输入是否正确");
    160. }
    161. /**
    162. * 提示用户取件成功
    163. * @param e
    164. */
    165. public void printCode(Express e){
    166. System.out.println("快递取件码为:"+e.getCode());
    167. }
    168. /**
    169. * 快递员存储时存储重复的提示语
    170. */
    171. public void expressExist(){
    172. System.out.println("快递单号已存在");
    173. }
    174. /**
    175. * 操作成功提示语
    176. */
    177. public void success(){
    178. System.out.println("操作成功");
    179. }
    180. /**
    181. * 取件人的菜单uMenu
    182. * @return
    183. */
    184. public int uMenu(){
    185. System.out.println("请输入取件码");
    186. String code = input.nextLine();
    187. int num = -1;
    188. try{
    189. //将用户输入的取件码,转换为int数据类型
    190. num = Integer.parseInt(code);
    191. }catch(NumberFormatException e){
    192. System.out.println("请输入正确的取件码");
    193. return uMenu();
    194. }
    195. //判断取件码
    196. if(num<100000 || num>999999){
    197. System.out.println("输入错误,请重新输入");
    198. return uMenu();
    199. }
    200. return num;
    201. }
    202. }