JAVA零基础小白学习免费教程day14-Set&HashMap(三)

简介: JAVA零基础小白学习免费教程day14-Set&HashMap

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();
}

}


         


目录
相关文章
|
1天前
|
存储 安全 算法
【JAVA】HashMap扩容性能影响及优化策略
【JAVA】HashMap扩容性能影响及优化策略
|
1天前
|
存储 Java 索引
【JAVA】HashMap的put()方法执行流程
【JAVA】HashMap的put()方法执行流程
|
2天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
3天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
6 2
|
4天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
4天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
4天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
4天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
Java 数据库 容器
|
2天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略