快递e栈(面向对象篇)
思路:
1,视图显示(欢迎,菜单...)
2, 数据存储(快递数据)
3,调用逻辑(根据视图接受用户输入的内容,调度数据逻辑)
1,视图显示(view)
package com.java.view;
import com.java.bean.Express;
import java.util.Scanner;
public class Views {
private Scanner input = new Scanner(System.in);
/**
* 欢迎
*/
public void welcome() {
System.out.println("欢迎使用xxx公司快递管理系统");
}
/**
* 再见
*/
public void bye() {
System.out.println("欢迎下次使用");
}
/**
* 选择用户身份
*
* @return
*/
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) {
return menu();
}
return num;
}
/**
* 快递员菜单
*
* @return
*/
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;
}
/**
* 快递的录入
*
* @return
*/
public Express insert() {
System.out.println("请根据提示,输入快递信息");
System.out.println("请输入快递单号");
String number = input.nextLine();
System.out.println("请输入快递公司");
String company = input.nextLine();
Express e = new Express();
e.setCompany(company);
e.setNumber(number);
return e;
}
/**
* 提示用户输入快递单号
*
* @return
*/
public String findByNumber() {
System.out.println("根据提示,请输入快递信息");
System.out.println("请输入快递的单号");
String number = input.nextLine();
return number;
}
/**
* 显示快递信息
*/
public void printExpress(Express e) {
System.out.println("快递信息如下:");
System.out.println("快递公司:" + e.getCompany() + ",快递单号:" + e.getNumber()+",取件码为:"+e.getCode());
}
public void printNull(){
System.out.println("此快递为空");
}
/**
* 修改快递信息
*
* @param e
* @return
*/
public void update(Express e) {
System.out.println("请输入新的快递单号");
String number = input.nextLine();
System.out.println("请输入新的快递公司");
String company = input.nextLine();
e.setCompany(company);
e.setNumber(number);
}
/**
* 快递的删除
* @return
*/
public int delete(){
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 delete();
}
return num;
}
/**
*快递的打印
*/
public void printAll(Express[][] 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)+"列快递,");
printExpress(es[i][j]);
}
}
}
if(count == 0){
System.out.println("暂无快递信息");
}
}
/**
* 用户菜单
*
* @return
*/
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 void expressExist(){
System.out.println("此单号在快递柜中已经存储,请检查单号是否有误");
}
public void success(){
System.out.println("删除成功");
}
}
分析:
首先进入选择身份菜单1)快递员身份:1,录入快递
2,修改快递和删除快递:首先要进行快递单号的查找,并打印出快递的信息,进行修改和删除
3,查看所有快递:利用for循环遍历查找,定义count,每次添加count++,每次取出快递count--,如果查找快递时,count为0,证明快递要么没存入,或者已经取出
2)普通用户身份:根据取件码进行取件(6位取件码),if判断输入的取件码是否为六位,输入有误返回上一级——普通用户菜单
2,数据的存储(bean)Express
package com.java.bean;
import java.util.Objects;
public class Express {
//单号
private String number;
//公司名称
private String company;
//取件码
private int code;
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;
}
public Express(String number, String company, int code) {
this.number = number;
this.company = company;
this.code = code;
}
public Express() {
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return Objects.equals(number, express.number);
}
@Override
public int hashCode() {
return Objects.hash(number);
}
}
分析:
生成快递单号(number),快递公司(company),取件码(code)的get,set,有参无参构造方法,toString,
和快递单号(number)的equals方法
3,调用逻辑(ExpressDao)
package com.java.dao;
import com.java.bean.Express;
import java.util.Random;
public class ExpressDao {
private Express[][] data = new Express[10][];
private int size;
{ //生成一个10*10的快递柜
for(int i=0;i<10;i++){
data[i] = new Express[10];
}
}
private Random random = new Random();
/**
* 用于存储快递
* @param e
* @return
*/
public boolean add(Express e) {
if (size == 100) {
return false;
}
//1,随机生成2个0—9的下标
int x = -1;
int y = -1;
while (true) {
x = random.nextInt(10);
y = random.nextInt(10);
if (data[x][y] == null) {
//此位置暂无快递
break;
}
//2,生成取件码
}
int code = randomCode();
e.setCode(code);
data[x][y] = e;
return true;
}
public int randomCode(){
while (true){
int code = random.nextInt(900000)+100000;
Express e = findByCode(code);
if (e == null){
return code;
}
}
}
/**
* 通过快递单号进行查询
* @param number
* @return
*/
public Express findByNumber(String number){
Express e = new Express();
e.setNumber(number);
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])){
return data[i][j];
}
}
}return null;
}
//通过取件码进行查找
public Express 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 void updata(Express oldExpress,Express newExpress){
delete(oldExpress);
add(newExpress);
}
public void delete(Express e){
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;
}
}
}
}
public Express[][] findAll(){
return data;
}
}
分析:
1,首先利用二维数组,生成一个10*10的快递柜,接着利用random方法生成两个随机下标,第几排第几列的位置,如果下标【x】【y】下标为空的,则证明有位置可以存
并定义一个size,判断快递柜是否存满,存满直接返回false
2,随机生成六位取件码,并通过取件码对比判断快递柜是否为空的,空的直接存储,如果有快递接着while死循环,直到有空的位置
4,mian方法调用
package com.java.main;
import com.java.bean.Express;
import com.java.dao.ExpressDao;
import com.java.view.Views;
public class Main {
private static Views v = new Views();
private static ExpressDao dao = new ExpressDao();
public static void main(String[] args) {
//视图初始化
//初始化dao对象
//1,欢迎
v.welcome();
//2,弹出菜单
while (true){
int menu = v.menu();
switch (menu){
case 0:
break;
case 1:
cClient();
break;
case 2:
uClient();
break;
}
}
}
private static void uClient() {
//1,取件码获取
int code = v.uMenu();
//2,根据取件码,取出快递
Express e = dao.findByCode(code);
if(e == null){
v.printNull();
}else{
v.success();
v.printExpress(e);
dao.delete(e);
}
}
private static void cClient() {
while(true){
int menu = v.cMenu();
switch(menu){
case 0:
return;
case 1:{
//1,提示快递信息
Express e = v.insert();
//2,此快递是否已经存过
Express e2 = dao.findByNumber(e.getNumber());
//3,存快递
if (e2 == null){
dao.add(e);
v.printExpress(e);
}else{
v.expressExist();
}
}
break;
case 2:{
//1,显示快递信息
String number = v.findByNumber();
//2,查找数据
Express e = dao.findByNumber(number);
Express e2 = e;
//3,打印快递信息
if (e == null){
v.printNull();
}else{
v.printExpress(e);
}
//4,修改快递
v.update(e);
dao.updata(e,e2);
v.printExpress(e2);
}
break;
case 3:{
//1,输入快递信息
String number = v.findByNumber();
//2,查找快递对象
Express e = dao.findByNumber(number);
if(e == null){
v.printNull();
}else{
v.printExpress(e);
int type = v.delete();
if(type == 1){
dao.delete(e);
v.success();
}
}
}
break;
case 4:{
Express[][] data = dao.findAll();
v.printAll(data);
}
break;
}
}
}
}