基于控制台的快递管理系统(学习总结)
程序员文章站
2024-02-01 21:29:58
...
学习过程中写了两版,总结一下收获吧。
大体要求:
有两种身份,分为快递小哥和取快递的人,快递小哥可以存快递,删除快递,修改快递信息,查看当前所有的快递。
原来的思路:(代码被我不小心删了)
存储快递信息,然后取出快递信息,更改快递信息等操作其实一下子就是能想到数组,于是我利用了一个二维数组,模拟快递柜子,里面存放用户输入的快递信息,为了实现快递格子的取件功能,和单号查询功能我再次新建了两个二维数组,然后在给第一个二维数组存信息的时候,给第二第三个数组同步存放单号、取件码。也就是说有三个二维数组,里面分别存了快递信息,取件码,单号,这些数据对应的下标是一致的,但是这种操作的方式会感觉非常麻烦。
修改后的思路:
利用arraylist的set()方法实现快递柜子的空间判断,也实现了取件码取件功能,利用map的key存单号,然后value放那些信息。
附上代码
入口类
public class Main {
private static InputJudge i=new InputJudge();
private static Date d=new Date();
public static void main(String[] args) {
//开始
i.welcome();
//用户身份判断
int menu=i.view();
switch (menu){
case 3:
break;
case 1:
runner();
break;
case 2:
buyer();
break;
}
//结束
i.end();
}
private static void buyer() {
d.finddelivery();
//找数组中有没有这个取件码
}
private static void runner() {
int sight= i.sender();
//快递小哥目标判断
all: while(true){
xun: switch (sight) {
case 1: {
d.adddelivery();
}
case 2: {
//删除快递
delete();
}
case 3: {
//修改
change();
}
case 4: {
//查看当前所有快递
see();
break all;
}
}
}
}
private static void delete(){
int cas =i.delete();
switch (cas){
case 1:{
d.deldelivery();
}
case 2:{
break;
}
}
}
private static void change(){
int cas =i.Reput();
switch (cas){
case 1:{
d.readddelivery();
}
case 2:{
break;
}
}
}
private static void see() {
int cas = i.print();
switch (cas) {
case 1: {
d.print();
}
case 2: {
break;
}
}
}
}
输入逻辑判断,用于选项选择和输入内容限制
public class InputJudge {
private Scanner input = new Scanner(System.in);
public void welcome() {
System.out.println("欢迎使用有家快递服务");
}
public void end() {
System.out.println("再见");
}
/*
*身份判断
*/
public int view() {
System.out.println("请输入您的用户信息,快递小哥请输1,取件请输2,退出请按3");
String people = input.nextLine();
int num = 0;
try {
num = Integer.parseInt(people);
} catch (NumberFormatException e) {
System.out.println("您输入的信息有误,请重新输入");
}
if (num < 1 || num > 3) {
System.out.println("您输入的信息有误,请重新输入");
return view();
}
//用户输入逻辑限制
return num;
}
public int sender() {
System.out.println("请输入您想执行的功能");
System.out.println("存快递请按1");
System.out.println("删除快递请按2");
System.out.println("修改快递信息请按3");
System.out.println("查看当前所有快递信息请按4");
System.out.println("退出请按5");
String people = input.nextLine();
int num = 0;
try {
num = Integer.parseInt(people);
} catch (NumberFormatException e) {
}
if (num < 1 || num > 5) {
System.out.println("您输入的信息有误,请重新输入");
return view();
}
return num;
}
/*
*快递小哥功能
*/
public String reciver() {
System.out.println("请输入您的6位取件码");
String number = input.nextLine();
int thingnum = number.length();
if (thingnum!= 6) {
System.out.println("你输入的取件码有误,请重新输入");
return reciver();
}
else{
System.out.println("请稍等");
}
return number;
}
/*
*用户取件
*/
//快递小哥输入快递信息
public int Reput(){
System.out.println("是否要更改某个快递,确认输入1,取消输入2");
String people = input.nextLine();
int num = 0;
try {
num = Integer.parseInt(people);
} catch (NumberFormatException e) {
}
if (num < 1 || num > 2) {
System.out.println("您的输入有误,请重新输入");
return delete();
}
//用户输入逻辑限制
return num;
}
public int print(){
System.out.println("是否要查看当前柜子的内容,确认输入1,取消输入2");
String people = input.nextLine();
int num = 0;
try {
num = Integer.parseInt(people);
} catch (NumberFormatException e) {
}
if (num < 1 || num > 2) {
System.out.println("您的输入有误,请重新输入");
return delete();
}
//用户输入逻辑限制
return num;
}
public int delete(){
System.out.println("是否要删除某个快递,确认输入1,取消输入2");
String people = input.nextLine();
int num = 0;
try {
num = Integer.parseInt(people);
} catch (NumberFormatException e) {
}
if (num < 1 || num > 2) {
System.out.println("您的输入有误,请重新输入");
return delete();
}
//用户输入逻辑限制
return num;
}
//删除快递信息确认,返回值用于判断想执行的操作
}
用于处理数据
//处理数据,包括增加删除和遍历等等。
public class Date{
//用于存放单号和对应的所有快递信息。
public static HashMap<String, String> map = new HashMap<String,String>();
//用于快递的取件码和快递位置,还没有想好怎么初始化list的数据,只能用这种方法了。
public static List<String> list=Arrays.asList(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null);
private Scanner input = new Scanner(System.in);
private String number,information,recivecode;
private int where;
//添加快递
public void adddelivery(){
System.out.println("正在检索");
//先判断是否有空
if(judge()==1){
//返回第一次出现null的位置
where=list.indexOf(null);
System.out.println("柜子里面还有地方,您可以在填写完下面的信息后把快递放到第"+where+"号格子里面");
System.out.println("请输入快递的单号");
number=input.nextLine();
System.out.println("请输入快递公司");
String company=input.nextLine();
recivecode=Recivecode();
information="快递公司是"+company+",放在了第"+where+"号格子里面"+",取件码是:"+recivecode;
//存入信息
map.put(number,information);
list.set(where,recivecode);
System.out.println("快递信息为:"+information+",请把快递放于指定位置");
}
else if(judge()==2){
System.out.println("不好意思,这个柜子里没有闲置的了");
}
}
//删除快递,应该会用到遍历
public void deldelivery(){
System.out.println("请输入您要删除的快递的单号");
String s=input.nextLine();
if (map.containsKey(s)==true){
System.out.println("请输入提供给用户的取件码以确认。");
String n=input.nextLine();
if (list.contains(n)==true){
map.remove(s);
list.set(list.indexOf(n),null);
System.out.println("删除完成");
}
else{
System.out.println("验证失败,取消操作");
}
}
else{
System.out.println("不好意思,没有你要删除的快递");
}
}
//查找快递
public void finddelivery(){
System.out.println("请输入您的取件码");
String s=input.nextLine();
int t=list.indexOf(s);
if(t!=-1){
System.out.println("您的快递位于第"+t+"号格子里面,欢迎下次使用");
//取出快递之后就把该位置的内容变成null,然后就又可以往里面存了
list.set(t,null);
}
else{
System.out.println("不好意思,没找到您的快递");
}
}
//更新快递
public void readddelivery() {
System.out.println("请输入您想更改信息的快递单号");
String s=input.nextLine();
if (map.containsKey(s)==true){
System.out.println("原快递信息为"+map.get(s)+",请输入新的快递信息,没有更改的部分一并写上");
String n=input.nextLine();
map.replace(s,n);
System.out.println("更改完成");
}
else{
System.out.println("不好意思,没有你要更改的快递");
}
}
//输出所有快递信息
public void print() {
Set<Map.Entry<String,String>> es =map.entrySet();
for (Map.Entry entry:es){
System.out.print("快递单号:"+entry.getKey()+"具体信息"+entry.getValue());
}
System.out.println("\n----------------------");
}
private int judge(){
int nums=0;
if(list.contains(null)==true){
nums=1;
}
else{
nums=2;
}
return nums;
}
public String Recivecode() {
String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random=new Random();
StringBuffer sb=new StringBuffer();
//Stringbuffer直接操作字符串,省的再建字符串了
for(int i=0;i<6;i++){
int number=random.nextInt(62);
sb.append(str.charAt(number));
}
String recivecode=sb.toString();
return recivecode;
}
//从上面的字符串里面,随机生成一个字符串,
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
总结:我也知道这个代码写的不是很好,毕竟初学,不懂的地方挺多的,我这次写代码总结了一下,就是还是要先有一个大概的思路,你大概需要什么功能,然后你把功能的入口先写好,内容先不管,你就只管整体逻辑正确,等到你假设所有内容铺设完了按照这个逻辑执行时能达到你的预期效果,那么你再去考虑怎么添加具体的功能实现部分,感觉我之前之所以写代码吃力还是习惯从头到尾的一点点实现,之后还是要改。
这个暂时只有这些,等后续学的更多了,我再拿出更好的版本。
连载中