Javaの集合HashMap写快递管理系统v2.0
- 一 任务概述
- 二 复习
- 1 集合的分类、特点与区别
- 2 常用函数或方法
- 三 任务拆解
- 1 创建快递对象
- 2 快递界面及部分通用功能
- 3 主程序
- (1)case选择
- (2)生成相互联系的快递(信息)
- (3)修改快递信息
- (4)删除快递信息
- (5)删除快递信息
- (6)用户根据code查取快递
- 四 完整代码
- 1 快递信息对象
- 2 快递界面及部分通用功能
- 3 主程序代码
一 任务概述
1,管理员:
- 快递录入
- 快递位置 (随机,不能重复)
- 快递单号 (输入)
- 快递公司 (输入)
- 6位取件码 (随机,不能重复)
- 快递删除 (根据单号)
- 快递修改 (根据单号)
- 查看所有快递 (遍历)
2,普通用户
- 快递取出
- 输入取件码,显示快递信息和在哪个柜子,从柜子中移除快递
二 复习
1 集合的分类、特点与区别
数组 | 集合 | |
长度 | 固定 | 可变 |
存储类型 | 同类型 | 类型可不一致 |
存储单元 | 元素 | 对象 |
使用场景 | — | 对象多时 |
数组存在的问题:元素的个数固定(不能扩容)、不利于插入。
集合: java 对数据结构(数组、栈、队列、链表和红黑树等)的实现。
类集中最大的几个操作接口:Collection、Map、Iterator,这三个接口为要使用的最重点的接口。
Collection | Map |
单列集合,单值存储 | 双列集合,对值存储 |
Collection | Collection | Collection | Collection |
List | List | Set | Set |
元素有序,元素可重复 | 元素有序,元素可重复 | 元素无序,且不可重复 | 元素无序,且不可重复 |
ArrayList | LinkedList | HashSet | TreeSet |
数据存储的结构是数组结构 | 链表结构(可当做栈、队列使用) | 链表和哈希表组合的数据存储结构 | |
元素增删慢,查找快 | 方便元素增删(首尾方法) | 散列无序地存储 | 有序地二叉树存储(自然顺序) |
Map:
HashMap与HashTable,结果一样,散列存放;
ConcurrentHashMap,结果一样但与HashMap顺序不同;
TreeMap,会自动排序;
LinkedHashMap,使用HashMap还能保证存储顺序,既在HashMap中又在双向链表中。
鉴于(1)快递的单号、取件码、存货位置不可重复(排除List类),(2)一码一货(key -> value),选择使用HashMap(对值存储)。
2 常用函数或方法
// 对象的get函数
e.getX()、e.getY()、e.getCompany、e.getNumber()、e.getCode()
private static Map<String, Express> expressMap = new HashMap<>();
// 判断key->的快递是否为空
expressMap.get(code) != null
expressMap.get(oldExpressNumber) == null
// map.put("key1", "value1")
expressMap.put(number, e);
// map.getKey()、map.getValue()
// 移除 map.remove(number)
expressMap.remove(oldExpressNumber);
expressMap.remove(expressMap.get(delExpressNumber).getCode());
expressMap.remove(expressMap.get(delExpressNumber).getX());
expressMap.remove(expressMap.get(delExpressNumber).getY());
// 遍历keySet()输出
for (String number : expressMap.keySet()) {
Express e = expressMap.get(number);
System.out.println("···");
}
// 根据取件码找对象
if (expressMap.get(number).getCode() == code ){
String s = number;
Express e = expressMap.get(s);
System.out.println("···");
}
三 任务拆解
1 创建快递对象
public class Express {
private String number; // 快递单号
private String company; // 快递公司
private int code; // 取件码
private int x; // 快递箱排数
private int y; // 快递箱列数
}
创建get、set、equals、toString、有参等;
2 快递界面及部分通用功能
(1)欢迎语、再见语
(2)选择身份菜单(判断输入参数要合理)
考察点:字符串转数字Integer.parseInt(text)、异常处理NumberFormatException、返回数据类型
(3) 快递员浏览的菜单、用户浏览的菜单(判断输入参数要合理)
考察点:同上
(4)是否删除界面(判断输入参数要合理)
考察点:同上
(5)快递不存在、已存在的提示语
3 主程序
(1)case选择
m:while (true) {
int menu = v.menu();
switch (menu) {
case 0: // 退出
v.bye();
break m;
case 1: // 快递员
cClient();
break;
case 2: // 普通用户
uClient();
break;
}
while (true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1:{ // 快递录入
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();
System.out.println("请输入快递单号:");
String number = input.nextLine();
// 内容
}
break;
case 2: { // 快递修改
System.out.println("请输入要修改的快递单号:");
String oldExpressNumber = input.nextLine();
// 内容
}
break;
case 3 : { // 快递删除
System.out.print("请输入要删除的快递单号:");
String delExpressNumber = input.nextLine();
// 内容
}
break;
case 4 :{ // 查看所有快递
// 内容
}
break;
}
}
(2)生成相互联系的快递(信息)
// 生成 不重复 的六位数取货码
int code = 0;
do{
code = random.nextInt(900000)+100000;
}while(expressMap.get(code) != null); // Hashmap保证不重复
// 生成 不重复 的快递位置
int x = -1;
int y = -1;
do{
x = random.nextInt(10);
y = random.nextInt(10);
}while(expressMap.get(x) != null && expressMap.get(y) != null);
// 创建一个快递对象
Express e = new Express(number,company,code,x,y);
expressMap.put(number, e);
System.out.println("快递存储成功!");
System.out.println("快递存放在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列。快递信息: " +
"快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
"取件码为【" + e.getCode() + "】。");
(3)修改快递信息
只更换number,不更换code、x、y。
int code = expressMap.get(oldExpressNumber).getCode();
int x = expressMap.get(oldExpressNumber).getX();
int y = expressMap.get(oldExpressNumber).getY();
Express e = new Express(newExpressNumber,company,code,x,y);
expressMap.remove(oldExpressNumber);
expressMap.put(newExpressNumber, e);
System.out.println("快递信息修改成功!");
System.out.println("第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列的快递 快递信息: " +
"快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
"取件码为【" + e.getCode() + "】。");
(4)删除快递信息
删除code、x、y,以便新增快递。
expressMap.remove(expressMap.get(delExpressNumber).getCode());
expressMap.remove(expressMap.get(delExpressNumber).getX());
expressMap.remove(expressMap.get(delExpressNumber).getY());
expressMap.remove(delExpressNumber);
System.out.println("快递删除成功!");
(5)删除快递信息
for (String number : expressMap.keySet()) {
Express e = expressMap.get(number);
System.out.println("···");
}
(6)用户根据code查取快递
for (String number : expressMap.keySet()) {
// 单号存在
if (expressMap.get(number).getCode() == code ){
String s = number;
Express e = expressMap.get(s);
System.out.println("快递在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列");
// 用户取件后
System.out.println("取货成功!");
expressMap.remove(e.getCode());
expressMap.remove(e.getX());
expressMap.remove(e.getY());
expressMap.remove(e.getNumber());
}
}
为了判断“快递不存在”,加入已存快递计数器count。
int temp = 0;
for (String number : expressMap.keySet()) {
temp ++ ;
// 单号存在
// 略
// 单号不存在
} else if (count == temp ){
v.printNull();
}
}
四 完整代码
1 快递信息对象
import java.util.Objects;
public class Express {
private String number; // 快递单号
private String company; // 快递公司
private int code; // 取件码
private int x; // 快递箱排数
private int y; // 快递箱列数
public Express(String number) {
this.number = number;
}
public Express(String number, String company, int code, int x, int y) {
this.number = number;
this.company = company;
this.code = code;
this.x = x;
this.y = y;
}
public String getNumber() {
return number;
}
public String getCompany() {
return company;
}
public int getCode() {
return code;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setNumber(String number) {
this.number = number;
}
public void setCompany(String company) {
this.company = company;
}
public void setCode(int code) {
this.code = code;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return code == express.code &&
x == express.x &&
y == express.y &&
Objects.equals(number, express.number) &&
Objects.equals(company, express.company);
}
@Override
public int hashCode() {
return Objects.hash(number, company, code, x, y);
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
", x=" + x +
", y=" + y +
'}';
}
}
2 快递界面及部分通用功能
import java.util.Scanner;
public class View {
private Scanner input = new Scanner(System.in);
/*
欢迎与再见
*/
public void welcome() {
System.out.println("欢迎使用XXX快递管理系统!");
}
public void bye() {
System.out.println("欢迎下次使用!");
}
/*
选择身份的菜单
*/
public int menu() {
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递员");
System.out.println("2.普通用户");
System.out.println("0.退出");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 2 ) {
System.out.println("输入错误,请重新输入:");
return menu();
}
return num;
}
/*
快递员浏览的菜单
*/
public int cMenu(){
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递录入");
System.out.println("2.快递修改");
System.out.println("3.快递删除");
System.out.println("4.查看所有快递");
System.out.println("0.返回上级目录");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 4 ) {
System.out.println("输入错误,请重新输入:");
return cMenu();
}
return num;
}
/*
用户浏览的菜单
*/
public int uMenu(){
System.out.println("请根据提示,进行取件:");
System.out.println("请输入您的取件码:");
String code = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(code);
}catch(NumberFormatException e) {
}
if ( num < 100000 || num > 999999 ) {
System.out.println("输入错误,请重新输入:");
return uMenu();
}
return num;
}
/*询问是否删除*/
public int delete() {
System.out.println("是否确认删除:");
System.out.println("1.确认删除");
System.out.println("2.取消删除");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 2 ) {
System.out.println("输入错误,请重新输入:");
return delete();
}
return num;
}
public void expressExit(){
System.out.println("此单号在快递柜中已存在,请勿重复存储!");
}
public void printNull(){
System.out.println("快递不存在,请检查输入!");
}
}
3 主程序代码
import java.util.*;
public class main {
private static View v = new View();
private static Map<String, Express> expressMap = new HashMap<>();
private static Scanner input = new Scanner(System.in);
private static Random random = new Random();
private static int count;
public static void main(String[] args) {
v.welcome();
/* 身份选择菜单
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递员");
System.out.println("2.普通用户");
System.out.println("0.退出");
*/
m:while (true) {
int menu = v.menu();
switch (menu) {
case 0: // 退出
v.bye();
break m;
case 1: // 快递员
cClient();
break;
case 2: // 普通用户
uClient();
break;
}
}
}
/* 快递员菜单
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递录入");
System.out.println("2.快递修改");
System.out.println("3.快递删除");
System.out.println("4.查看所有快递");
System.out.println("0.返回上级目录");
*/
private static void cClient() {
while (true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1:{ // 快递录入
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();
System.out.println("请输入快递单号:");
String number = input.nextLine();
if (expressMap.get(number) != null) {
v.expressExit();
} else {
// 生成 不重复 的六位数取货码
int code = 0;
do{
code = random.nextInt(900000)+100000;
}while(expressMap.get(code) != null);
// 生成 不重复 的快递位置
int x = -1;
int y = -1;
do{
x = random.nextInt(10);
y = random.nextInt(10);
}while(expressMap.get(x) != null && expressMap.get(y) != null);
Express e = new Express(number,company,code,x,y);
expressMap.put(number, e);
System.out.println("快递存储成功!");
System.out.println("快递存放在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列。快递信息: " +
"快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
"取件码为【" + e.getCode() + "】。");
count++;
// System.out.println("当前快递存储数为:"+count);
}
}
break;
case 2: { // 快递修改
System.out.println("请输入要修改的快递单号:");
String oldExpressNumber = input.nextLine();
if (expressMap.get(oldExpressNumber) == null) {
v.printNull();
} else {
System.out.println("请输入新的快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();
System.out.print("请输入新的快递单号:");
String newExpressNumber = input.nextLine();
int code = expressMap.get(oldExpressNumber).getCode();
int x = expressMap.get(oldExpressNumber).getX();
int y = expressMap.get(oldExpressNumber).getY();
Express e = new Express(newExpressNumber,company,code,x,y);
expressMap.remove(oldExpressNumber);
expressMap.put(newExpressNumber, e);
System.out.println("快递信息修改成功!");
System.out.println("第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列的快递 快递信息: " +
"快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
"取件码为【" + e.getCode() + "】。");
}
}
break;
case 3 : { // 快递删除
System.out.print("请输入要删除的快递单号:");
String delExpressNumber = input.nextLine();
if (expressMap.get(delExpressNumber) == null) {
v.printNull();
} else {
int type = v.delete();
if (type == 1) {
// 取货码 存储位置 快递 信息清空
expressMap.remove(expressMap.get(delExpressNumber).getCode());
expressMap.remove(expressMap.get(delExpressNumber).getX());
expressMap.remove(expressMap.get(delExpressNumber).getY());
expressMap.remove(delExpressNumber);
System.out.println("快递删除成功!");
count --;
// System.out.println("当前快递存储数为:"+count);
}
}
}
break;
case 4 :{ // 查看所有快递
for (String number : expressMap.keySet()) {
Express e = expressMap.get(number);
System.out.println("第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列的快递 快递信息: " +
"快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
"取件码为【" + e.getCode() + "】。");
}
// System.out.println("当前快递存储数为:"+count);
break;
}
}
}
}
private static void uClient() {
int code = v.uMenu();
int temp = 0;
// 根据code找快递单号
for (String number : expressMap.keySet()) {
temp ++ ;
// 单号存在
if (expressMap.get(number).getCode() == code ){
String s = number;
Express e = expressMap.get(s);
System.out.println("快递在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列 快递信息: " +
"快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】。");
// 用户取件后
System.out.println("取货成功!");
expressMap.remove(e.getCode());
expressMap.remove(e.getX());
expressMap.remove(e.getY());
expressMap.remove(e.getNumber());
count --;
break;
// 单号不存在
} else if (count == temp ){
v.printNull();
}
}
}
}