快递系统(数组储存)的分析解题思路
前言
本系列是我自己关于遇到过的编程题目进行的分析思路总结,希望能够帮助到需要帮助的那些需要帮助的编程小白,同时也欢迎各位前辈予以指正和批评指导,谢谢。
题目:
任务用于熟悉快递管理业务,完成快递管理控制台项目,具体需求如图。
个人初步分析
- 需存储的数据有快递单号,快递公司,取件码,柜子位置(个人认为实际生活中位置应该是快递员选择指定),这里要求采用二维数组的方式存储数据
- 管理员有快递录入,快递删除(根据单号),快递修改(根据单号),查看所有快递(遍历)4个功能
- 普通用户只能根据取件码取快递
个人解题思路
说明
1.快递系统
① Views类(视图类)
② Data类(数据存储类)
③ Import类(数据使用类)
④ Call类(执行方法调度类)
⑤ Main类(程序执行类)
2.实现功能
① 快递员
快递录入
- 柜子位置生成(系统随机生成)
- 快递单号生成(输入)
- 快递公司(输入)
- 取件码(系统随机生成)
快递信息修改
快递删除
全部快递查找
② 普通用户
快递取件
- 输入取件码,取出快递同时删除系统内快递信息
1.视图类Views
根据要求进行各类视图的编码
/**
* 视图类
*/
public class Views {
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();
// 定义num
int num = -1;
// 异常处理
try{
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
// 如果不是0,1,2则重新输入
if (num<0 || num>2){
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();
// 定义num
int num = -1;
// 异常处理
try{
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
// 如果不是0,1,2,3,4则重新输入
if (num<0 || num>4){
System.out.println("选择内容错误,请重新选择");
return cMenu();
}
return num;
}
/**
* 录入信息
*/
public Data insert(){
System.out.println("请根据以下提示,输入快递信息:");
System.out.print("请输入快递单号:");
System.out.println();
// 输入快递单号
String number = input.nextLine();
System.out.print("请输入快递公司:");
// 输入快递公司
String company = input.nextLine();
Data e = new Data();
// 数据录入
e.setNumber(number);
e.setCompany(company);
return e;
}
/**
* 查找快递
*/
public String findByNumber(){
System.out.println("请根据以下提示,输入快递信息:");
System.out.print("请输入需要进行操作的快递单号:");
// 输入需查找快递单号
String number = input.nextLine();
// 返回快递单号数据
return number;
}
/**
* 查找快递
*/
public void printData(Data e){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+e.getCompany()+",快递单号:"+e.getNumber()+",取件码:"+e.getCode());
}
/**
* 查找快递
*/
public void printNull(){
System.out.println("快递不存在,请检查您的输入!");
}
/**
* 修改快递信息
*/
public void update(Data e){
System.out.print("请输入新的快递单号:");
System.out.println();
// 输入新的快递单号
String number = input.nextLine();
System.out.print("请输入新的快递公司:");
// 输入新的快递公司
String company = input.nextLine();
e.setNumber(number);
e.setCompany(company);
}
/**
* 删除快递菜单
*/
public int delete(){
System.out.println("是否确认删除?");
System.out.println("1.确认删除");
System.out.println("2.取消删除");
System.out.println("0.返回上级目录");
// 输入交互内容
String text = input.nextLine();
// 定义num
int num = -1;
// 异常处理
try{
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
// 如果不是0,1,2则重新输入
if (num<0 || num>2){
return delete();
}
return num;
}
/**
* 遍历显示全部快递信息
*/
public void printAll(Data[][] es){
int count = 0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(es[i][j] != null) {
count++;
System.out.print("第"+(i+1)+"排,"+(j+1)+"列快递,");
printData(es[i][j]);
}
}
}
if(count == 0){
System.out.println("暂无快递信息");
}
}
/**
* 普通用户菜单
*/
public int uMenu(){
System.out.println("请根据以下提示,进行取件操作:");
System.out.print("请输入您的取件码:");
// 输入交互内容
String text = input.nextLine();
// 定义num
int num = -1;
// 异常处理
try{
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if(num<100000 || num>999999){
System.out.println("输入有误,请重新输入");
return uMenu();
}
return num;
}
/**
* 存储重复
*/
public void dataExist(){
System.out.println("此单号在快递柜中已存在,请勿重复存储");
}
/**
* 快递取件码打印
*/
public void printCode(Data e){
System.out.println("快件的取件码为:"+e.getCode());
}
/**
* 快递取件码打印
*/
public void success(){
System.out.println("操作成功");
}
}
2.数据类Data
此类中快递单号,快递公司,取件码的生产
/**
* 快递数据存储类
*/
public class Data {
// 单号
private String number;
// 快递公司
private String company;
// 取件码
private int code;
// 全参构造方法
public Data(String number, String company, int code) {
this.number = number;
this.company = company;
this.code = code;
}
// 无参构造方法
public Data() {
}
// toString方法
public String toString() {
return "Data{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}
// 对比快递单号
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Data data = (Data) o;
return Objects.equals(number, data.number);
}
// 返回快递单号
public String getNumber() {
return number;
}
// 赋值快递单号
public void setNumber(String number) {
this.number = number;
}
// 返回快递公司
public String getCompany() {
return company;
}
// 赋值快递公司
public void setCompany(String company) {
this.company = company;
}
// 返回取件码
public int getCode() {
return code;
}
// 赋值取件码
public void setCode(int code) {
this.code = code;
}
}
3.数据导入类Import
主要为数据的操作和存储,在这里采用2维数组进行存储,主要为录入,修改,删除和遍历操作
/**
* 快递数据导入类
*/
public class Import {
// 假设快递柜的存放格为10X10的规格,共100个,定义一个二维数组
private Data[][] data = new Data[10][];
// 定义一个快递柜存储数
private int size;
// 构建二维数组data[10][10]
{
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
data[i] = new Data[10];
}
}
}
// 定义随机数
private Random random = new Random();
/**
* 录入数据
*/
public boolean add(Data e) {
if (size == 100) {
return false;
}
// 随机产生两个0-9的数
int x = -1;
int y = -1;
while (true) {
x = random.nextInt(10);
y = random.nextInt(10);
if (data[x][y] == null) {
// 此位置无快递
break;
}
}
// 取件码
int code = randomCode();
e.setCode(code);
data[x][y] = e;
return true;
}
/**
* 随机生成取件码
*/
private int randomCode(){
while(true) {
// 随机生成6位取件码
int code = random.nextInt(900000) + 100000;
Data e = findByCode(code);
// 判断是否重复
if(e == null){
return code;
}
}
}
/**
* 查询快递单号
*/
public Data findByNumber(String number){
Data e = new Data();
e.setNumber(number);
for(int i=0;i<10;i++) {
for (int j = 0; j < 10; j++) {
if (e.equals(data[i][j])){
return data[i][j];
}
}
}
return null;
}
/**
* 查询取件码
*/
public Data findByCode(int code){
for(int i=0;i<10;i++) {
for (int j = 0; j < 10; j++) {
if(data[i][j] != null)
if (data[i][j].getCode() == code){
return data[i][j];
}
}
}
return null;
}
public String findByPosition(int code){
for(int i=0;i<10;i++) {
for (int j = 0; j < 10; j++) {
if(data[i][j] != null)
if (data[i][j].getCode() == code){
String n = "快递位置为"+i+"行"+j+"列";
return n;
}
}
}
return null;
}
/**
* 多于操作,为了mvc更圆润
*/
public void update(Data oldData,Data newData){
delete(oldData);
add(newData);
}
/**
* 删除快递数据
*/
public void delete(Data e){
p:for(int i=0;i<10;i++) {
for (int j = 0; j < 10; j++) {
if (data[i][j] != null)
if (e.equals(data[i][j])) {
data[i][j] = null;
break p;
}
}
}
}
/**
* 遍历
*/
public Data[][] findAll(){
return data;
}
}
4.数据调用类Call
该类主要是各种数据方法的调用
/**
* 调度类
*/
public class Call {
// 初始化视图对象
private static Views v = new Views();
// 初始化视图对象
private static Import i = new Import();
/**
* 快递员菜单交互调度
*/
public void cClient() {
while (true){
int menu = v.cMenu();
switch (menu){
case 0:
return;
case 1:// 快递录入
typing();
break;
case 2:// 快递修改
modify();
break;
case 3:// 快递删除
delete();
break;
case 4:// 所以快递查询
ergodic();
break;
}
}
}
/**
* 遍历快递调度
*/
public void ergodic() {
Data[][] data = i.findAll();
v.printAll(data);
}
/**
* 删除调度
*/
public void delete() {
// 输入快递单号
String number = v.findByNumber();
// 查找快递对象
Data e = i.findByNumber(number);
if(e == null){
v.printNull();
}else{
v.printData(e);
int type = v.delete();
if(type == 1){
// 删除目标
i.delete(e);
// 提示成功
v.success();
}
}
}
/**
* 修改调度
*/
public void modify() {
// 提示输入快递信息
String number = v.findByNumber();
// 查找数据
Data e = i.findByNumber(number);
Data e2 = e;
// 打印快递信息
if(e == null){
v.printNull();
}else{
v.printData(e);
// 提示修改
v.update(e2);
i.update(e,e2);
v.printData(e2);
}
}
/**
* 存储调度
*/
public void typing() {
// 提示输入快递信息
Data e = v.insert();
// 数据是否已经存储过
Data e2 = i.findByNumber(e.getNumber());
// 存储快递
if(e2 == null) {
// 未存储过,进行存储
i.add(e);
v.printData(e);
}else{
// 信息已经在系统内
v.dataExist();
}
}
/**
* 普通用户取件调度
*/
public void uClient() {
// 取件码获取
int code = v.uMenu();
// 根据取件码去除快递
Data e = i.findByCode(code);
if(e == null){
v.printNull();
}else{
v.success();
System.out.println(i.findByPosition(code));
v.printData(e);
i.delete(e);
}
}
}
5.程序执行类Main
为初始操作界面和Call类方法的调用
/**
* 程序执行类
*/
public class Main {
// 初始化视图对象
private static Views v = new Views();
// 初始化调度方法
private static Call c = new Call();
public static void main(String[] args) {
// 1.欢迎
v.welcome();
m:while(true){
// 弹出身份选择菜单
int menu = v.menu();
switch (menu){
case 0:
break m;
case 1:
c.cClient();
break;
case 2:
c.uClient();
break;
}
}
// 结束使用,退出离开
v.bye();
}
}