题目:
【1】将以下车站对应关系的数据存储到map集合中, key:表示站编号,value:表示站名,遍历并打印(可以不按顺序)
站编号和站名对应关系如下: 1 朱辛庄 2 育知路 3 平西府 4 回龙观东大街 5 霍营 6 育新 7 西小口 8 永泰庄 9 林萃桥 10 森林公园南门 11 奥林匹克公园 12 奥体中心 13 北土城 14 安华桥 15 安德里北街 16 鼓楼大街 17 什刹海 18 南锣鼓巷 19 中国美术馆
【2】计算地铁票价规则: 总行程 3站内(包含3站)收费3元, 3站以上但不超过5站(包含5站)的收费4元, 5站以上的,在4元的基础上,每多1站增加2元, 10元封顶;
需要对键盘录入的上车站 和到达站进行判断,如果没有该站, 提示重新输入,直到站名存在为止 每站需要2分钟
示范如下:
请输入上车站: 流沙河
您输入的上车站:流沙河站不存在,请重新输入上车站: 骑龙 您输入的上车站:骑龙站不存在,请重新输入上车站: 朱辛庄 您已确定在朱辛庄上站! 请输入到达站: 沙河 您输入的到达站:沙河站不存在,请重新输入到达站: 西二旗 您输入的到达站:西二旗站不存在,请重新输入到达站: 西小口 您已确定在朱辛庄下站!从朱辛庄到西小口共经过6站收费6元,大约需要12分钟
第一小题很简单,就是创建Map集合,把数据添加进去,再遍历就可
我们主要来看看第二小题,我按照我思考的方式写下了下面代码:
我的思路:获取输入的上车站,遍历集合hm里的值,如果相等就获取到达站(不等就给出提示并继续获取),遍历集合hm里的值,与输入的到达站比较,相等就再来个循环遍历hm里的键,找到上车站对应的键,然后再来个循环遍历hm里的键,找到到达站对应的键,根据键来计算所需时间和所需花费的钱.......
System.out.println("请输入上车站:");
boolean flag = true;
while(flag){
Scanner sc = new Scanner(System.in);
String start = sc.nextLine();
Collection<String> values = hm.values();
for(String v : values){
if(v.equals(start)){
System.out.println("您已确定在" + start +"上站!");
System.out.println("⬇");
System.out.println("请输入到达站:");
while(flag) {
String end = sc.nextLine();
if (v.equals(end)) {
System.out.println("您已确认在" + end + "下站!");
Set<Integer> keySet = hm.keySet();
for (int startNum : keySet) {
if (hm.get(startNum).equals(start)) {
for (int endNum : keySet) {
if (hm.get(endNum).equals(end)) {
int number = Math.abs(endNum - startNum);//经过站数量
int allFree = 0;
if (number <= 3) {
allFree = 3;
} else if (number <= 5) {
allFree = 4;
} else {
allFree = 4 + (number - 5) * 2;
if (allFree > 10) {
allFree = 10;
}
}
System.out.println("从" + start + "到" + end + "共经过" + number + "站收费" + allFree + "元,大约需要" + (number * 2) + "分钟");
break;
}
}
}
break;
}
} else {
System.out.println("⬇");
System.out.println("您输入的到达站:" + end + "不存在,请重新输入到达站:");
flag = true;
break;
}
}
}else {
System.out.println("⬇");
System.out.println("您输入的上车站:" + start + "不存在,请重新输入上车站:");
flag = true;
break;
}
}
}
思路并没什么问题,但这代码就挺大问题的!!!学了数据结构后,我知道一个算法的时间复杂度与循环次数有紧密关系,而我这代码 用了五个循环!!!而且运行也是有问题的,下面是修改版本:
不需要遍历values集合,直接使用containsValue()方法,判断该站点是否存在集合即可(减少了两个循环)
System.out.println("请输入上车站:");
while (true) {
Scanner sc = new Scanner(System.in);
String start = sc.nextLine();
//Collection<String> values = hm.values();
//for(String v : values){
//不需要遍历values集合,直接使用containsValue()方法,判断该站点是否存在集合即可
if (hm.containsValue(start)) {
System.out.println("您已确定在" + start + "上站!");
System.out.println("⬇");
System.out.println("请输入到达站:");
while (true) {
String end = sc.nextLine();
//不需要遍历values集合,直接使用containsValue()方法,判断该站点是否存在集合即可
if (hm.containsValue(end)) {
System.out.println("您已确认在" + end + "下站!");
Set<Integer> keySet = hm.keySet();
int startNum = 0;
int endNum = 0;
for (int num : keySet) {
if (hm.get(num).equals(start)) {
startNum = num;
}
// for (int endNum : keySet) {
if (hm.get(num).equals(end)) {
endNum = num;
}
}
int number = Math.abs(endNum - startNum);//经过站数量
int allFree;
if (number <= 3) {
allFree = 3;
} else if (number <= 5) {
allFree = 4;
} else {
allFree = 4 + (number - 5) * 2;
if (allFree > 10) {
allFree = 10;
}
}
System.out.println("从" + start + "到" + end + "共经过" + number + "站收费" + allFree + "元,大约需要" + (number * 2) + "分钟");
break;
} else {
System.out.println("⬇");
System.out.println("您输入的到达站:" + end + "不存在,请重新输入到达站:");
//flag = true;
}
}
} else {
System.out.println("⬇");
System.out.println("您输入的上车站:" + start + "不存在,请重新输入上车站:");
//flag = true;
}
}
下面再来一个进阶版,从问题的答案出发,找需要用到量,再将它们分块求出来再凑在一起求出答案。
Scanner sc = new Scanner(System.in); String sStart;//上车站 String sEnd;//到达站 //获取上车站 System.out.println("请输入上车站:"); while (true){ sStart = sc.next(); if(hm.containsValue(sStart)){ System.out.println("您已确定在" + sStart +"上站!"); System.out.println("⬇"); break; }else { System.out.println("⬇"); System.out.println("您输入的上车站:" + sStart + "不存在,请重新输入上车站:"); } } //获取到达站 System.out.println("请输入到达站:"); while (true){ sEnd = sc.next(); if(hm.containsValue(sEnd)){ System.out.println("您已确认在" + sEnd + "下站!"); break; }else { System.out.println("⬇"); System.out.println("您输入到达站:" + sEnd + "不存在,请重新输入到达站:"); } } //获取站点编号及间隔差 int iStart = 0; int iEnd = 0; int iSub = 0; Set<Integer> keySet = hm.keySet(); for(Integer i : keySet){ if(hm.get(i).equals(sStart)){ iStart = i ; } if(hm.get(i).equals(sEnd)){ iEnd = i; } } if(iStart > iEnd){ //iSub = 19 - iEnd + iStart; //因为地铁有往返两趟,所以直接求两站间的站数即可(或用Math.abs()求绝对值 iSub = iStart - iEnd; } else { iSub = iEnd - iStart; } //计算金额 int price = 0; if(iSub <= 3){ price = 3; }else if(iSub <= 5){ price = 4; }else { price = 4 + (iSub - 5)*2; } price = price > 10 ? 10 : price; //计算时间 int time = iSub * 2; System.out.println("从" + sStart + "到" + sEnd + "共经过" + iSub + "站收费" + price + "元,大约需要" + time + "分钟");
这样就比较清晰明了了**,拜拜~