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);
}
}
}青凌,亘瑶
羽灰,赤鸣
霍琊,游浩贤
进程已结束,退出代码 02.(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 教JDBC
map.put("Allen","JDBC");
//3. Lucy 改为教CoreJava
map.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
进程已结束,退出代码 03.模拟斗地主洗牌发牌(争取根据自己的思路在写一遍)
/*
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
进程已结束,退出代码 04.【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