题目:

【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 + "分钟");

这样就比较清晰明了了**,拜拜~

Map练习题:求地铁票价相关推荐

  1. java 地铁费_Java练习题_Map集合,遍历车站编号及名称、计算地铁票价。

    [1]将以下车站对应关系的数据存储到map集合中, key:表示站编号,value:表示站名, 并遍历打印(可以不按顺序打印): [2]计算地铁票价规则: 总行程 3站内(包含3站)收费3元, 3站以 ...

  2. 大学地铁购票计算金额java_Java练习题_Map集合,遍历车站编号及名称、计算地铁票价。...

    [1]将以下车站对应关系的数据存储到map集合中, key:表示站编号,value:表示站名, 并遍历打印(可以不按顺序打印): [2]计算地铁票价规则: 总行程 3站内(包含3站)收费3元, 3站以 ...

  3. 设计模式之策略模式在地铁票价系统中的应用

    引言 设计模式是面向对象编程的一个非常精彩的部分.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,它能帮助我们将应用组织成容易了解,容易维护,具有弹性的架构.本文通过一个简单的案 ...

  4. 编程帮助小明计算地铁票价(C++)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 北京地铁票价发生了变化,现在新的计算规则如下:6公里内3元(包括6公里). 6-12公里4元(不包括6公里,包括12公里). ...

  5. 题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元

    题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元(不包括 ...

  6. java 地铁费_通过java程序模拟实现地铁票价2+2=12

    地铁票价在这周六开始就要上涨了,这几天做地铁明显感觉人比平常多了很多.大家也都在默默的等待这一刻的到来,尽管很不情愿,但是终究会来. 到时候肯定吐槽的人一抓一大把,毕竟一天上班4块的时代就要终结,一下 ...

  7. 通过java程序模拟实现地铁票价2+2=12(r3笔记第94天)

    地铁票价在这周六开始就要上涨了,这几天做地铁明显感觉人比平常多了很多.大家也都在默默的等待这一刻的到来,尽管很不情愿,但是终究会来. 我们先来看一个简单的例子. ticket_fee1=2; tick ...

  8. linux写一个10的阶乘,C语言练习题:求1到10的阶乘之和简单实例

    C语言练习题:求1到10的阶乘之和简单实例 C语言练习题:求1到10的阶乘之和简单实例 #include int factorial(int n) { if(0==n) return 1; if(1= ...

  9. POJ 4113:北京地铁票价-BeiJing Subway

    做一道水题欢乐一下. 总时间限制: 1000ms 内存限制: 65536kB 描述 从2014年12月28日起,北京市公交地铁将执行新的票价方案.其中地铁的票价方案改为:6公里(含)内3元:6公里至1 ...

最新文章

  1. 10个有趣的javascript和css库(2019年5月最新)
  2. 第一章 Mysql 简介及安装和配置
  3. java实现收货7天发通知,Java实训的第7天
  4. 把一个dataset的表放在另一个dataset里面_视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响)...
  5. LCD1602液晶显示模块的单片机驱动深入详解之硬件篇
  6. 《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置
  7. h3c s7506e 配置手册_H3C交换机s5500Web登录配置
  8. MYSQL 学习笔记记录整理之三:子查询
  9. python学习笔记2018-9-18
  10. python渲染html页面_在Python中使用CasperJS获取JS渲染生成的HTML内容的教
  11. springboot+vue汽车4S店车辆销售维修管理系统java源码
  12. 软素质面试题分享以及一些面试技巧和面试礼仪
  13. 服务器版“永恒之蓝”高危预警 (Samba远程命令执行漏洞CVE-2017-7494) 攻击演示...
  14. linux启动过程文件系统崩溃,Linux启动过程中文件系统的加载
  15. 20位大佬,勾勒出一个中国网络安全江湖
  16. 小灰的基金,总算是回血一波。。。
  17. 汉字转换为拼音的JavaScript库
  18. LC72 Edit Distance
  19. 人工智能中的Web端编程
  20. Cisco Packet Tracer的DHCP

热门文章

  1. python 求两线段是否相交,如果相交求交点
  2. C语言的 restrict 关键字的作用
  3. 三次样条插值(Spline插值)
  4. android程序字体大小,Android如何动态调整应用字体大小详解
  5. orb-slam系列 LoopClosing线程 DetectLoop(十)
  6. 狂肝半个月-嵌入式开发学习学习路线+知识汇总
  7. Xcode The 'Apple Push Notification' feature is only available to users enrolled in Apple Develo...
  8. cmd进入指定目录方法
  9. JAVA梅森旋转随机算法_梅森旋转算法
  10. 计算机浮点数的格式,单精度与双精度的区别