1.如何遍历Map中的key-value对,代码实现(至少2种)
Map集合的遍历(方式1)键找值:
package com.B.Container_13.Map;import java.util.HashMap;
import java.util.Map;
import java.util.Set;//Map集合的遍历(方式1)键找值
public class Map04_01 {public static void main(String[] args) {//创建集合对象Map<String, String> map = new HashMap<String, String>();//添加元素map.put("霍琊","游浩贤");map.put("青凌","亘瑶");map.put("羽灰","赤鸣");//获取所有键的集合。用keySet()方法实现Set<String> keySet = map.keySet();//遍历键的集合,获取到每一个键。用增强for实现for (String key : keySet) {//根据键去找值。用get(Object key)方法实现String value = map.get(key);System.out.println(key + "," + value);}}
}
Map集合的遍历(方式2)键值对对象找键找值:
package com.B.Container_13.Map;import java.util.HashMap;
import java.util.Map;
import java.util.Set;//Map集合的遍历(方式2)键值对对象找键找值
//Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
public class Map04_02 {public static void main(String[] args) {//创建集合对象Map<String, String> map = new HashMap<String, String>();//添加元素map.put("霍琊","游浩贤");map.put("青凌","亘瑶");map.put("羽灰","赤鸣");//获取所有键值对对象的集合Set<Map.Entry<String, String>> entrySet = map.entrySet();//遍历键值对对象的集合,得到每一个键值对对象for (Map.Entry<String, String> me : entrySet) {//根据键值对对象获取键和值String key = me.getKey();String value = me.getValue();System.out.println(key + "," + value);}}
}
青凌,亘瑶
羽灰,赤鸣
霍琊,游浩贤进程已结束,退出代码 0
2.(Map)已知某学校的教学课程内容安排如下:
前者是老师,后者是老师所教的课程:
("Tom", "CoreJava");
("John", "Oracle");
("Susan", "Oracle");
("Jerry", "JDBC");
("Jim", "Unix");
("Kevin", "JSP");
("Lucy", "JSP");
完成下列要求:
1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
2) 增加了一位新老师Allen 教JDBC
3) Lucy 改为教CoreJava
4) 遍历Map,输出所有的老师及老师教授的课程(用Set<Map.Entry<String,String>>、Set<String> get(key)都可)
5) 利用Map,输出所有教JSP的老师。
代码:
package com.B.Container_13.Map.Practice;import java.util.HashMap;
import java.util.Map
import java.util.Set;//(Map)已知某学校的教学课程内容安排如下:
public class A7 {public static void main(String[] args) {
//1.使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
// 创建对象HashMap<String, String> map = new HashMap<>();
// 添加元素map.put("Tom", "CoreJava");map.put("John", "Oracle");map.put("Susan", "Oracle");map.put("Jerry", "JDBC");map.put("Jim", "Unix");map.put("Kevin", "JSP");map.put("Lucy", "JSP");//2.增加了一位新老师Allen 教JDBCmap.put("Allen","JDBC");//3. Lucy 改为教CoreJavamap.put("Lucy", "CoreJava");//同键第二次出现是替换//4. 遍历Map,输出所有的老师及老师教授的课程
//4.(用Set<Map.Entry<String,String>>、Set<String> get(key)都可)
//方法一 键找值//获取所有键的集合。用keySet()方法实现Set<String> keySet = map.keySet();//遍历键的集合,获取到每一个键。用增强for实现for (String key : keySet) {//根据键去找值。用get(Object key)方法实现String value = map.get(key);System.out.println(key+"老师教授的课程为:"+value);}System.out.println("(方法一 键找值)");System.out.println("-----------");//方式二 键值对对象找键找值
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍历键值对对象的集合,得到每一个键值对对象for (Map.Entry<String, String> ss : entrySet) {//根据键值对对象获取键和值
String key = ss.getKey();
String value = ss.getValue();System.out.println(key+"老师教授的课程为:"+value);}System.out.println("(方式二 键值对对象找键找值)");System.out.println("-----------");//5.利用Map,输出所有教JSP的老师
// 通过遍历值找到对应键Set<Map.Entry<String,String>> es = map.entrySet();for (Map.Entry<String, String> sss: es) {//根据键值对对象获取键和值String key = sss.getKey();String value = sss.getValue();if (value == "JSP"){System.out.println(key);
}}}
}
Kevin老师教授的课程为:JSP
Tom老师教授的课程为:CoreJava
Susan老师教授的课程为:Oracle
John老师教授的课程为:Oracle
Lucy老师教授的课程为:CoreJava
Jerry老师教授的课程为:JDBC
Allen老师教授的课程为:JDBC
Jim老师教授的课程为:Unix
(方法一 键找值)
-----------
Kevin老师教授的课程为:JSP
Tom老师教授的课程为:CoreJava
Susan老师教授的课程为:Oracle
John老师教授的课程为:Oracle
Lucy老师教授的课程为:CoreJava
Jerry老师教授的课程为:JDBC
Allen老师教授的课程为:JDBC
Jim老师教授的课程为:Unix
(方式二 键值对对象找键找值)
-----------
Kevin进程已结束,退出代码 0
3.模拟斗地主洗牌发牌(争取根据自己的思路在写一遍)
/*
1、分析:首先应准备牌:完成数字与纸牌的映射关系:使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系。
洗牌:通过数字完成洗牌发牌(借助工具类)
发牌:将每个人以及底牌设计,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌给3个玩家。存放的过程中要求数字大小与斗地主规则的大小对应排序。将代表不同纸牌的数字分配给不同的玩家与底牌。
看牌:通过Map集合找到对应字符展示。通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。*/
斗地主出现的问题:
查看牌时报错,检查后发现打出Hash自动生成时生成了单列表HashSet而不是HashMap
改为HashMap后正常编译运行
排版上的小问题,牌与牌之间可以用空格隔开
改进后更好看牌了
完整的代码:
package com.B.Container_13.Map.Practice;import java.util.*;public class A8 {public static void main(String[] args) {
//首先应准备牌:完成数字与纸牌的映射关系:使用双列Map(HashMap)集合,
// 完成一个数字与字符串纸牌的对应关系。
// 创建对象,HashMap键是编号,值是牌HashMap<Integer, String> poker = new HashMap<Integer, String>();
//储存编号ArrayList<Integer> list = new ArrayList<>();//添加花色和数字数组String[] colors = {"♥", "♠", "♦", "♣"};//花色,红桃、黑桃、方片、梅花String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "K", "Q", "J", "A"};//数字// 从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号int index = 0;
// 双循环,外循环是花色,内循环是数字for (String color : colors) {for (String number : numbers) {poker.put(index, color + number);//往HashMap里面存储编号,并存储对应的牌list.add(index);//往ArrayList里面存储编号index++;//编号自增}}
//导入大小王,存入编号poker.put(index, "大王");list.add(index);index++;//编号自增poker.put(index, "小王");list.add(index);//54张牌0-53编号,满了//洗牌(洗的是编号index),用Collections的shuffle()方法实现Collections.shuffle(list);//发牌:将每个人以及底牌设计,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌给3个玩家。
//存放的过程中要求数字大小与斗地主规则的大小对应排序。将代表不同纸牌的数字分配给不同的玩家与底牌。//创建TreeSet集合接收排序的牌(编号)TreeSet<Integer> aSet = new TreeSet<Integer>();TreeSet<Integer> bSet = new TreeSet<Integer>();TreeSet<Integer> cSet = new TreeSet<Integer>();TreeSet<Integer> dpSet = new TreeSet<Integer>();//底牌
//遍历发牌for (int i = 0; i < list.size(); i++) {int x = list.get(i);if (i >= list.size() - 3) {dpSet.add(x);//最后三张牌给到底牌} else if (i % 3 == 0) {aSet.add(x);//编号对3取余,若余数为0给到玩家a} else if (i % 3 == 1) {bSet.add(x);//编号对3取余,若余数为1给到玩家b} else if (i % 3 == 2) {cSet.add(x);//编号对3取余,若余数为2给到玩家c}}// 看牌:通过Map集合找到对应字符展示。通过查询纸牌与数字的对应关系,
// 由数字转成纸牌字符串再进行展示。*///因为调用的方法相同,所以可以先定义一个方法,调用方法即可
//调用看牌方法lookPoker("路人A", aSet, poker);lookPoker("路人B", bSet, poker);lookPoker("路人C", cSet, poker);lookPoker("底牌", dpSet, poker);}public static void lookPoker (String name, TreeSet < Integer > ts, HashMap< Integer, String > poker){System.out.print(name+"的牌是:");//不分行for (Integer key : ts) {String y = poker.get(key);System.out.print(y+" ");//不分行}System.out.println();//间隔}}
结果:
路人A的牌是:♥3 ♥4 ♥8 ♥Q ♠K ♦2 ♦4 ♦5 ♦K ♦Q ♦J ♣7 ♣9 ♣10 ♣Q ♣J 大王
路人B的牌是:♥2 ♥5 ♥6 ♥7 ♥9 ♥K ♠4 ♠8 ♠J ♠A ♦7 ♦8 ♦10 ♦A ♣2 ♣3 ♣6
路人C的牌是:♥10 ♥J ♥A ♠2 ♠3 ♠5 ♠6 ♠7 ♠9 ♠10 ♦3 ♦6 ♦9 ♣4 ♣8 ♣A 小王
底牌的牌是:♠Q ♣5 ♣K 进程已结束,退出代码 0
4.【1】将以下车站对应关系的数据存储到map集合中,
key:表示站编号,value:表示站名,
并遍历打印(可以不按顺序打印):
------------------------------------
站编号和站名对应关系如下:
1 朱辛庄
2 育知路
3 平西府
4 回龙观东大街
5 霍营
6 育新
7 西小口
8 永泰庄
9 林萃桥
10 森林公园南门
11 奥林匹克公园
12 奥体中心
13 北土城
14 安华桥
15 安德里北街
16 鼓楼大街
17 什刹海
18 南锣鼓巷
19 中国美术馆
------------------------------------
代码:
package com.B.Container_13.Map.Practice;import java.util.TreeMap;//1.将以下车站对应关系的数据存储到map集合中,
//key:表示站编号,value:表示站名,
//并遍历打印(可以不按顺序打印):
public class A9 {public static void main(String[] args) {
// 创建对象TreeMap<Integer, String> station = new TreeMap<>();//put(K key, V value) 将指定的值与该映射中的指定键相关联station.put(1,"朱辛庄");station.put(2,"育知路");station.put(3,"平西府");station.put(4,"回龙观东大街");station.put(5,"霍营");station.put(6,"育新");station.put(7,"西小口");station.put(8,"永泰庄");station.put(9,"林萃桥");station.put(10,"森林公园南门");station.put(11," 奥林匹克公园");station.put(12,"奥体中心");station.put(13,"北土城");station.put(14,"安华桥");station.put(15,"安德里北街");station.put(16,"鼓楼大街");station.put(17,"什刹海");station.put(18,"南锣鼓巷");station.put(19,"中国美术馆");//输出System.out.println(station);}
}
输出:{1=朱辛庄, 2=育知路, 3=平西府, 4=回龙观东大街, 5=霍营, 6=育新, 7=西小口, 8=永泰庄, 9=林萃桥, 10=森林公园南门, 11= 奥林匹克公园, 12=奥体中心, 13=北土城, 14=安华桥, 15=安德里北街, 16=鼓楼大街, 17=什刹海, 18=南锣鼓巷, 19=中国美术馆}进程已结束,退出代码 0
【2】计算地铁票价规则:
总行程 3站内(包含3站)收费3元,
3站以上但不超过5站(包含5站)的收费4元,
5站以上的,在4元的基础上,每多1站增加2元,
10元封顶;
需要对键盘录入的上车站
和到达站进行判断,如果没有该站,
提示重新输入,直到站名存在为止
每站需要2分钟
示范如下:
-------------------------------------
请输入上车站:
流沙河
您输入的上车站:流沙河站不存在,请重新输入上车站:
骑龙
您输入的上车站:骑龙站不存在,请重新输入上车站:
朱辛庄
您以确定在朱辛庄上站!
请输入到达站:
沙河
您输入的到达站:沙河站不存在,请重新输入到达站:
西二旗
您输入的到达站:西二旗站不存在,请重新输入到达站:
西小口
您以确定在朱辛庄下站!
从朱辛庄到西小口共经过6站收费6元,大约需要12分钟
-----------------------------------------------
完整代码:
package com.B.Container_13.Map.Practice;import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;//1.将以下车站对应关系的数据存储到map集合中,
//key:表示站编号,value:表示站名,
//并遍历打印(可以不按顺序打印):
public class A9 {public static void main(String[] args) {
// 创建对象TreeMap<Integer, String> station = new TreeMap<>();//put(K key, V value) 将指定的值与该映射中的指定键相关联station.put(1, "朱辛庄");station.put(2, "育知路");station.put(3, "平西府");station.put(4, "回龙观东大街");station.put(5, "霍营");station.put(6, "育新");station.put(7, "西小口");station.put(8, "永泰庄");station.put(9, "林萃桥");station.put(10, "森林公园南门");station.put(11, " 奥林匹克公园");station.put(12, "奥体中心");station.put(13, "北土城");station.put(14, "安华桥");station.put(15, "安德里北街");station.put(16, "鼓楼大街");station.put(17, "什刹海");station.put(18, "南锣鼓巷");station.put(19, "中国美术馆");//输出System.out.println(station);//通过值(车站名)来查询// 获取上车站Scanner sc = new Scanner(System.in);String start;String end;while (true) {System.out.println("请输入上车站:");start = sc.nextLine();if (station.containsValue(start)) {break;} else {System.out.println("您输入的上车站:" + start + "站不存在,请重新输入上车站");}}
// 获取下车站while (true) {System.out.println("请输入到达站:");end = sc.nextLine();if (station.containsValue(end)) {break;} else {System.out.println("您输入的到达站:" + end + "站不存在,请重新输入到达站");}}// 获取站点编号及间隔差int iStart = 0;int iEnd = 0;int iSub;Set<Integer> sKey = station.keySet();for (Integer i : sKey) {if (start.equals(station.get(i))) {iStart = i;}if (end.equals(station.get(i))) {iEnd = i;}}if (iStart > iEnd) {iSub = iStart - iEnd;} else {iSub = iEnd - iStart;}// 计算金额int price;if (iSub <= 3) {price = 3;//总行程 3站内(包含3站)收费3元,} else if (iSub <= 5) {price = 4;//3站以上但不超过5站(包含5站)的收费4元,} else {price = 4 + (iSub - 5) * 2;//5站以上的,在4元的基础上,每多1站增加2元,}// 10元封顶price = price > 10 ? 10 : price;// 计算时间int time = iSub * 2;System.out.println("从[" + start + "]到[" + end + "]共经过" + iSub + "站,收费" + price + "元,大约需要" + time + "分钟");}
}
{1=朱辛庄, 2=育知路, 3=平西府, 4=回龙观东大街, 5=霍营, 6=育新, 7=西小口, 8=永泰庄, 9=林萃桥, 10=森林公园南门, 11= 奥林匹克公园, 12=奥体中心, 13=北土城, 14=安华桥, 15=安德里北街, 16=鼓楼大街, 17=什刹海, 18=南锣鼓巷, 19=中国美术馆}
请输入上车站:
摩西摩西
您输入的上车站:摩西摩西站不存在,请重新输入上车站
请输入上车站:
快乐
您输入的上车站:快乐站不存在,请重新输入上车站
请输入上车站:
朱辛庄
请输入到达站:
愉悦
您输入的到达站:愉悦站不存在,请重新输入到达站
请输入到达站:
霍营
从[朱辛庄]到[霍营]共经过4站,收费4元,大约需要8分钟进程已结束,退出代码 0