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

}


         


目录
相关文章
|
15天前
|
Java
Java之HashMap详解
本文介绍了Java中HashMap的源码实现(基于JDK 1.8)。HashMap是基于哈希表的Map接口实现,允许空值和空键,不同步且线程不安全。文章详细解析了HashMap的数据结构、主要方法(如初始化、put、get、resize等)的实现,以及树化和反树化的机制。此外,还对比了JDK 7和JDK 8中HashMap的主要差异,并提供了使用HashMap时的一些注意事项。
Java之HashMap详解
|
11天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
23 4
|
12天前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
18 4
|
12天前
|
Java 开发者
Java Set:当“重复”遇见它,秒变“独宠”!
在Java编程中,Set接口确保集合中的元素不重复,每个元素都是独一无二的“独宠”。本文介绍了Set的两种常见实现:HashSet和TreeSet。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet基于红黑树实现,不仅去重还能对元素进行排序。通过示例代码,展示了这两种集合的具体应用,帮助开发者更好地理解和使用Set。
20 4
|
18天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
18天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
17天前
|
存储 Java 开发者
Java Set:无序之美,不重复之魅!
在Java的集合框架中,Set接口以其“无序之美”和“不重复之魅”受到开发者青睐。Set不包含重复元素,不保证元素顺序,通过元素的hashCode()和equals()方法实现唯一性。示例代码展示了如何使用HashSet添加和遍历元素,体现了Set的高效性和简洁性。
28 4
|
17天前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
24 1
|
17天前
|
存储 算法 Java
Java中的Set,你真的了解它的“无重复”奥秘吗?
在Java的广阔天地里,Set以其独特的“无重复”特性,在众多数据结构中脱颖而出。本文将揭秘Set的“无重复”奥秘,带你领略其魅力。Set通过哈希算法和equals()方法协同工作,确保元素不重复。通过一个简单的案例,我们将展示HashSet如何实现这一特性。
26 1
|
17天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
下一篇
无影云桌面