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

}


         


目录
相关文章
|
5月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
311 1
|
5月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
344 1
|
6月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
181 1
|
5月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
444 0
|
5月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
523 8
|
6月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
418 10
|
6月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
98 5
|
6月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
177 5
|
6月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
229 3
|
6月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
116 1