JAVA零基础小白学习免费教程day14-Set&HashMap(二)https://developer.aliyun.com/article/1433779
TreeMap
TreeMap类概述
键是红黑树结构,可以保证键的排序和保证唯一
public static void main(String[] args) { // 创建集合对象 会对key进行排序,并且唯一 TreeMap<String, String> tm = new TreeMap<String, String>(); // 创建元素并添加元素 tm.put("a", "你好"); tm.put("c", "世界"); tm.put("e", "爪哇"); tm.put("b", "世界2"); tm.put("e", "爪哇EE"); // 遍历集合 Set<String> set = tm.keySet(); for (String key : set) { String value = tm.get(key); System.out.println(key + "---" + value); } }
Map集合案例
需求
计算一个字符串中每个字符出现次数。要求结果的格式: a(5)b(4)c(3)d(2)e(1)
代码实现
/* * 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1) * * 分析: * A:定义一个字符串(可以改进为键盘录入) * B:定义一个TreeMap集合 * 键:Character * 值:Integer * C:把字符串转换为字符数组 * D:遍历字符数组,得到每一个字符 * E:拿刚才得到的字符作为键到集合中去找值,看返回值 * 是null:说明该键不存在,就把该字符作为键,1作为值存储 * 不是null:说明该键存在,就把值加1,然后重写存储该键和值 * F:定义字符串缓冲区变量 * G:遍历集合,得到键和值,进行按照要求拼接 * H:把字符串缓冲区转换为字符串输出 * * 录入:linqingxia * 结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1) */ public class TreeMapDemo { public static void main(String[] args) { // 定义一个字符串(可以改进为键盘录入) Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); // 定义一个TreeMap集合 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); //把字符串转换为字符数组 char[] chs = line.toCharArray(); //遍历字符数组,得到每一个字符 for(char ch : chs){ //拿刚才得到的字符作为键到集合中去找值,看返回值 Integer i = tm.get(ch); //是null:说明该键不存在,就把该字符作为键,1作为值存储 if(i == null){ tm.put(ch, 1); }else { //不是null:说明该键存在,就把值加1,然后重写存储该键和值 i++; tm.put(ch,i); } } //定义字符串缓冲区变量 StringBuilder sb= new StringBuilder(); //遍历集合,得到键和值,进行按照要求拼接 Set<Character> set = tm.keySet(); for(Character key : set){ Integer value = tm.get(key); sb.append(key).append("(").append(value).append(")"); } //把字符串缓冲区转换为字符串输出 String result = sb.toString(); System.out.println("result:"+result); } }
集合的嵌套遍历
public static void main(String[] args) { Map<String, HashMap<String, Integer>> map = new HashMap<>(); HashMap<String, Integer> map1 = new HashMap<>(); map1.put("江一燕", 33); map1.put("yanqi", 33); map.put("jc", map1); HashMap<String, Integer> map2 = new HashMap<>(); map2.put("江一燕2", 33); map2.put("yanqi2", 33); map.put("jc2", map2); Set<String> set = map.keySet(); for (String key : set) { //获取所有key System.out.println(key); //根据key获取所有value HashMap<String, Integer> hashMap = map.get(key); Set<String> set2 = hashMap.keySet(); //接着再遍历value for (String key2 : set2) { Integer value = hashMap.get(key2); System.out.println("\t" + key2 + ":" + value); } } }
HashMap和Hashtable的区别?—面试题
/* * 1:Hashtable和HashMap的区别? * Hashtable:线程安全,效率低。不允许null键和null值 * HashMap:线程不安全,效率高。允许null键和null值 * * 2:List,Set,Map等接口是否都继承子Map接口? * List,Set不是继承自Map接口,它们继承自Collection接口 * Map接口本身就是一个顶层接口 */ public class HashtableDemo { public static void main(String[] args) { // HashMap<String, String> hm = new HashMap<String, String>(); Hashtable<String, String> hm = new Hashtable<String, String>(); hm.put("it001", "hello"); // hm.put(null, "world"); //NullPointerException // hm.put("java", null); // NullPointerException System.out.println(hm); } }
模拟斗地主案例 TODO
需求
按照斗地主的规则,完成洗牌发牌的动作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBkKnKfJ-1672475567271)(assets/image-20201120101957523.png)]
具体规则
1. 组装54张扑克牌将 2. 54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。 4. 查看三人各自手中的牌(按照牌的大小排序)、底牌 注意: 手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
需求分析
- 准备牌
完成数字与纸牌的映射关系:
使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
- 洗牌
通过数字完成洗牌发牌
- 发牌
将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
存放的过程中要求数字大小与斗地主规则的大小对应。
将代表不同纸牌的数字分配给不同的玩家与底牌。
- 看牌
通过Map集合找到对应字符展示。
通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。
代码实现
package com.itfxp.doudizhu; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; /* 斗地主案例步骤: 1. 组装牌 2. 洗牌 3. 发牌 17 4. 看牌 */ public class DDZDemo { public static void main(String[] args) { // 组装牌 // 牌盒 HashMap<Integer, String> poker = new HashMap<>(); // 创建集合:存储的是牌的编号 ArrayList<Integer> list = new ArrayList<>(); // 定义变量,记录牌的索引编号 int index = 2; // 定义两个数组 // 花色 String[] colors = { "♦", "♣", "♥", "♠"}; // 数字 String[] numbers = { "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"}; // 遍历花色和数字数组 for (String number : numbers) { for (String color : colors) { String p = color + number; poker.put(index, p); list.add(index); index++; } } // 将大小王存储到集合中 poker.put(0, "大王"); list.add(0); poker.put(1, "小王"); list.add(1); // System.out.println(list); // 洗牌 Collections.shuffle(list); // 发牌 ArrayList<Integer> player1 = new ArrayList<>(); ArrayList<Integer> player2 = new ArrayList<>(); ArrayList<Integer> player3 = new ArrayList<>(); ArrayList<Integer> diPai = new ArrayList<>(); // 遍历ArrayList集合 for (int i = 0; i < list.size(); i++) { if (i < 3) { // 给底牌 diPai.add(list.get(i)); } else if (i % 3 == 0) { // 玩家1 player1.add(list.get(i)); }else if (i % 3 == 1) { // 玩家2 player2.add(list.get(i)); }else if (i % 3 == 2) { // 玩家1 player3.add(list.get(i)); } } // 排序 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); // System.out.println(player1); // System.out.println(player2); // System.out.println(player3); // System.out.println(diPai); // 看牌 lookPoker("马蓉",player1,poker); lookPoker("王宝强",player2,poker); lookPoker("宋吉吉",player3,poker); lookPoker("底牌",diPai,poker); } public static void lookPoker(String playerName, ArrayList<Integer> list, HashMap<Integer, String> poker) { System.out.print(playerName+"的牌是:"); for (Integer key : list) { System.out.print(poker.get(key)+"\t"); } System.out.println(); } }
// 给底牌 diPai.add(list.get(i)); } else if (i % 3 == 0) { // 玩家1 player1.add(list.get(i)); }else if (i % 3 == 1) { // 玩家2 player2.add(list.get(i)); }else if (i % 3 == 2) { // 玩家1 player3.add(list.get(i)); } } // 排序 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); // System.out.println(player1); // System.out.println(player2); // System.out.println(player3); // System.out.println(diPai); // 看牌 lookPoker("马蓉",player1,poker); lookPoker("王宝强",player2,poker); lookPoker("宋吉吉",player3,poker); lookPoker("底牌",diPai,poker); } public static void lookPoker(String playerName, ArrayList<Integer> list, HashMap<Integer, String> poker) { System.out.print(playerName+"的牌是:"); for (Integer key : list) { System.out.print(poker.get(key)+"\t"); } System.out.println(); }
}