Express:快递属性类

    1. import java.util.Objects;
    2. public class Express {
    3. private String num; //快递单号
    4. private String company;//快递公司
    5. private int code;//快递取件码
    6. public Express() {
    7. }
    8. public Express(String num, String company, int code) {
    9. this.num = num; this.company = company; this.code = code; }
    10. public void setNum(String num) {
    11. this.num = num; }
    12. public void setCompany(String company) {
    13. this.company = company; }
    14. public void setCode(int code) {
    15. this.code = code; }
    16. public String getNum() {
    17. return num; }
    18. public String getCompany() {
    19. return company; }
    20. public int getCode() {
    21. return code; }
    22. /* 在管理系统中,有两个值需要比较:
    23. 1.对于快递员来说,需要根据快递码是否相同来执行删除或修改快递。
    24. 2.对于用户来说,需要根据取件码是否相同来执行取件操作。
    25. 3.equals方法不能同时解决两个问题,但是可以先解决一个码的问题。
    26. */
    27. @Override
    28. public boolean equals(Object o) {
    29. if (this == o) return true;
    30. if (o == null || getClass() != o.getClass())
    31. return false;
    32. Express express = (Express) o;
    33. return Objects.equals(num, express.num);
    34. }
    35. @Override
    36. public int hashCode() {
    37. return Objects.hash(num);
    38. }
    39. @Override
    40. public String toString() {
    41. return "Experss{" +
    42. "num='" + num + '\'' +
    43. ", company='" + company + '\'' +
    44. ", code=" + code +
    45. '}'; }
    46. }

    Main:

    1. import java.util.List;
    2. public class Main {
    3. private static Views views = new Views(); //初始化视图对象
    4. private static ExpressDao dao = new ExpressDao(); //初始化dao对象
    5. public static void main(String[] args) {
    6. //1.欢迎
    7. views.welcome();
    8. m: while (true) {
    9. //2.弹出身份选择菜单
    10. int menu = views.menu();
    11. switch (menu) {
    12. case 0:
    13. break m; //跳出m循环
    14. case 1:
    15. cClient(); //调用快递员的客户端
    16. break ;
    17. case 2:
    18. uClient();//调用用户的客户端 Client:客户端
    19. break ;
    20. }
    21. }
    22. views.bye();
    23. }
    24. private static void uClient() {
    25. //1.取件码获取
    26. int code = views.uMenu();
    27. //2.根据取件码取出快递
    28. Express e = dao.findByCode(code);
    29. if(e==null){
    30. views.printNull();
    31. }
    32. else{
    33. views.succeed();
    34. views.printExpress(e);
    35. dao.delete(e);
    36. }
    37. }
    38. private static void cClient() {
    39. while (true) {
    40. int menu = views.cMenu();//快递员菜单
    41. switch (menu) {
    42. case 0:
    43. return ;
    44. case 1: { //加入大括号,使得e成为局部对象,以便我们每个case都用一个对象名但不受到干扰
    45. /**
    46. * 快递录入
    47. */
    48. //1.提示输入快递信息
    49. Express e = views.insert(); //e是快递信息对象
    50. //2.此快递是否储存过
    51. Express e2 = dao.findByNumber(e.getNum());
    52. //3.存储快递
    53. if(e2==null){
    54. //单号未储存过,存入快递
    55. dao.Add(e);
    56. views.printExpress(e);//打印快递信息
    57. }
    58. else{
    59. //单号在快递柜中已存在
    60. views.expressExist();
    61. }
    62. }
    63. break;
    64. case 3:{
    65. /**
    66. * 快递修改
    67. */
    68. //1.提示输入快递信息
    69. String number = views.findByNumber();
    70. //2.查找数据
    71. Express e = dao.findByNumber(number);
    72. //3.打印快递信息
    73. if(e ==null){
    74. views.printNull();
    75. }
    76. else {
    77. views.printExpress(e); //打印快递信息
    78. }
    79. //4.提示修改
    80. views.update(e);
    81. dao.update(e,e); //这个update没什么意义
    82. views.printExpress(e); //打印修改后的快递信息
    83. }
    84. break;
    85. case 2:{
    86. /**
    87. * 删除
    88. */
    89. //1.输入快递单号
    90. String number = views.findByNumber();
    91. //2.查找快递对象
    92. Express e = dao.findByNumber(number);
    93. if(e==null ){
    94. views.printNull();
    95. }
    96. else {
    97. views.printExpress(e);
    98. int type = views.delete();
    99. if(type == 1){
    100. dao.delete(e);
    101. views.succeed();
    102. }
    103. }
    104. }
    105. break;
    106. case 4:{
    107. /**
    108. * 查看所有
    109. */
    110. List<Express> data = dao.findAll();
    111. views.printAll(data);
    112. }
    113. break;
    114. }
    115. }
    116. }
    117. }

    ExpressDao:

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.Random;
    4. public class ExpressDao {
    5. private ArrayList<Express> data = new ArrayList<>();//模拟一维快递柜
    6. private int size; //当前储存快递数
    7. private Random random = new Random(); //随机取件码对象
    8. /**
    9. * 用于存储快递
    10. *
    11. * @param e :快递信息对象(快递单号,快递公司)
    12. * @return :返回是否成功存储信息。
    13. */
    14. public boolean Add(Express e) {
    15. if (size == 100) { //如果快递柜满了,直接返回false给add函数,表示存储失败
    16. return false;
    17. }
    18. A: for (int i=0;i<data.size();i++){
    19. if (data.get(i)==null){
    20. //此位置无快递
    21. break A;
    22. }
    23. }
    24. // 2. 取件码
    25. int code = randomCode();
    26. e.setCode(code);
    27. return data.add(e); //储存快递信息
    28. }
    29. /**
    30. * 生成随机取件码
    31. *
    32. * @param
    33. */
    34. private int randomCode() {
    35. while (true) { //如果取件码取不到快递,就会返回code,如果取件码取到了快递,继续循环
    36. //六位数的随机码的正确范围应该是:100000-999999
    37. int code = random.nextInt((900000) + 100000);
    38. //范围应该是10000-(899999+100000)
    39. Express e = findByCode(code);
    40. if (e == null) { //生成的取件码在已生成的取件码中不存在的
    41. return code;//生成取件码成功,返回取件码
    42. }
    43. }
    44. }
    45. /**
    46. * 通过快递单号进行查询
    47. */
    48. public Express findByNumber(String number) {
    49. //Express e = new Express();
    50. //e.setNum(number);
    51. for (Express express:data){
    52. if (number.equals(express.getNum())){
    53. return express;
    54. }
    55. }
    56. return null;
    57. }
    58. /**
    59. * 根据取件码查询快递
    60. *
    61. * @param code 要查询的取件码
    62. * @return 查询失败时返回null
    63. */
    64. //通过取件码领取快递
    65. public Express findByCode(int code) {
    66. for (Express express:data){
    67. if (express!=null){
    68. if (express.getCode()==code){
    69. return express;
    70. }
    71. }
    72. }
    73. return null;
    74. }
    75. /**
    76. * 多余的操作,为了MVC更圆满
    77. * @param oldexpress
    78. * @param newexpress
    79. */
    80. //修改
    81. //得到的数据:1.原单号2.查到的原对象3.用户修改的信息
    82. //步骤:1.先查找到原单号。2.修改。3.把原单号的对象delete。4.重新存储(重新存储(即调用add(),并生成新的取件码)
    83. public void update(Express oldexpress, Express newexpress) {
    84. delete(oldexpress); //删除旧单号
    85. Add(newexpress);//添加新单号
    86. }
    87. //删除
    88. public boolean delete(Express e) {
    89. return data.remove(e);
    90. }
    91. //返回所有快递
    92. public List<Express> findAll() {
    93. return data;
    94. }
    95. }

    Views:

    1. import java.util.List;
    2. import java.util.Scanner;
    3. public class Views {
    4. private Scanner input = new Scanner(System.in);
    5. /**
    6. * 欢迎
    7. */
    8. public void welcome(){
    9. System.out.println("欢迎使用xxx快递管理系统");
    10. }
    11. /**
    12. * 再见
    13. */
    14. public void bye(){
    15. System.out.println("欢迎下次使用!");
    16. }
    17. /**
    18. * 选择身份菜单
    19. * @return
    20. */
    21. public int menu(){
    22. System.out.println("请根据提示,输入功能序号:");
    23. System.out.println("1:快递员");
    24. System.out.println("2:普通用户");
    25. System.out.println("0:退出");
    26. /*
    27. 这里的代码逻辑,相较于nextInt优点在哪?
    28. 单思考这个方法内的逻辑,没有什么优点。
    29. 但是思考全局代码,是有优点:所有方法均使用nextLine,不会因为输入产生冲突,还可以更好的接受各种类型的数据。
    30. 1.nextLine()与其他next方法会有冲突,只能使用一个。
    31. 2.在其他视图的用户输入,其内容不仅仅是整型数字,还有可能是其他基本类型。
    32. 3.因此,我们统一使用nextLine()来接受用户的输入
    33. */
    34. String text = input.nextLine(); //接收一行数据
    35. int num = -1;
    36. try {
    37. num = Integer.parseInt(text);
    38. }
    39. catch (NumberFormatException e){
    40. }
    41. if(num<0||num>2){
    42. System.out.println("输入有误,请重新输入!");
    43. return menu(); //重新调用menu,让他重新输入
    44. }
    45. return num;
    46. }
    47. /**
    48. * 快递员菜单
    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. num = Integer.parseInt(text);
    61. }
    62. catch (NumberFormatException e){
    63. }
    64. if(num<0||num>4){
    65. System.out.println("输入有误,请重新输入!");
    66. return cMenu(); //重新调用cmenu,让他重新输入
    67. }
    68. return num;
    69. }
    70. /**
    71. * 快递员录入快递
    72. * @return :包含了快递单号和快递公司的快递对象。
    73. */
    74. public Express insert() { //这里的Experss表示函数返回值是Experss对象类型
    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.setNum(number);
    83. return e;
    84. }
    85. /**
    86. * 提示用户输入快递单号
    87. * @return
    88. */
    89. //编写查询单号的方法,以便重复利用
    90. public String findByNumber(){
    91. System.out.println("请根据提示,输入快递信息:");
    92. System.out.println("请输入要操作的快递单号:");
    93. String number = input.nextLine();
    94. return number;
    95. }
    96. /**
    97. * 显示快递信息
    98. * @param e
    99. */
    100. //编写打印快递信息的方法,以便重复利用,给予用户确认输入信息是否有误。
    101. public void printExpress(Express e){
    102. System.out.println("快递信息如下:");
    103. System.out.println("快递公司:"+e.getCompany()+",快递单号:"+e.getNum()+",取件码:"+e.getCode());
    104. }
    105. /**
    106. * 修改快递信息
    107. * @param e
    108. */
    109. public void update(Express e){
    110. System.out.println("请根据提示,输入新的快递单号:");
    111. String number2 = input.nextLine();
    112. System.out.println("请输入新的快递公司:");
    113. String company = input.nextLine();
    114. e.setNum(number2); //修改快递单号
    115. e.setCompany(company); //修改快递公司
    116. }
    117. /**
    118. * 询问是否删除快递信息
    119. * @return 1表示确认,2表示取消操作
    120. */
    121. public int delete(){
    122. System.out.println("是否确认删除 y/n?");
    123. System.out.println("1:确认删除");
    124. System.out.println("2:取消操作");
    125. String text = input.nextLine();
    126. int num = -1;
    127. try {
    128. num = Integer.parseInt(text);
    129. }
    130. catch (NumberFormatException e){
    131. }
    132. if(num<1||num>2){
    133. System.out.println("输入有误,请重新输入!");
    134. return delete(); //重新调用delete,让他重新输入
    135. }
    136. return num;
    137. }
    138. /**
    139. * 给定数组快递信息,遍历显示
    140. * @return
    141. */
    142. public void printAll(List<Express> data){
    143. int count = 0;
    144. for (Express express:data){
    145. printExpress(express);
    146. }
    147. if(count==0){
    148. System.out.println("暂无快递信息");
    149. }
    150. }
    151. /**
    152. * 用户菜单
    153. */
    154. public int uMenu(){
    155. System.out.println("请根据提示,进行取件:");
    156. System.out.println("请输入您的取件码:");
    157. String code = input.nextLine(); //这个取件码要return的,但是return接收的类型是Int,所以要转一下星。
    158. int num = -1;
    159. try {
    160. num = Integer.parseInt(code);
    161. }
    162. catch (NumberFormatException e){
    163. }
    164. if(num<100000||num>999999){ //此判断条件是确保输入的是6位数
    165. System.out.println("输入有误,请重新输入!");
    166. return uMenu(); //重新调用umenu,让他重新输入
    167. }
    168. return num;
    169. }
    170. public void expressExist(){
    171. System.out.println("此单号在快递柜中已存在,请勿重复存储");
    172. }
    173. public void printNull(){
    174. System.out.println("快递不存在,请检查您的输入");
    175. }
    176. public void printcode(Express e){
    177. System.out.println("快递的取件码为:"+e.getCode());
    178. }
    179. public void succeed(){
    180. System.out.println("操作成功");
    181. }
    182. }