【Java】Map集合(二)

简介: 本期主要介绍Map集合

1.9 Map集合练习


需求:

计算一个字符串中每个字符出现次数。

分析:

  1. 获取一个字符串对象
  2. 创建一个Map集合,键代表字符,值代表次数。
  3. 遍历字符串得到每个字符。
  4. 判断Map中是否有该键。
  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。
  6. 打印最终结果

代码:

publicclassMapTest {
publicstaticvoidmain(String[] args) {
//友情提示System.out.println("请录入一个字符串:");
Stringline=newScanner(System.in).nextLine();
// 定义 每个字符出现次数的方法findChar(line);
    }
privatestaticvoidfindChar(Stringline) {
//1:创建一个集合 存储  字符 以及其出现的次数HashMap<Character, Integer>map=newHashMap<Character, Integer>();
//2:遍历字符串for (inti=0; i<line.length(); i++) {
charc=line.charAt(i);
//判断 该字符 是否在键集中if (!map.containsKey(c)) {//说明这个字符没有出现过//那就是第一次map.put(c, 1);
            } else {
//先获取之前的次数Integercount=map.get(c);
//count++;//再次存入  更新map.put(c, ++count);
            }
        }
System.out.println(map);
    }
}

第二章 补充知识点


2.1 JDK9对集合添加的优化


通常,我们在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 add方法 调用,使得代码重复。

publicclassDemo01 {
publicstaticvoidmain(String[] args) {
List<String>list=newArrayList<>();
list.add("abc");
list.add("def");
list.add("ghi");
System.out.println(list);
    }
}

Java 9,添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。

例子:

publicclassHelloJDK9 {  
publicstaticvoidmain(String[] args) {  
Set<String>str1=Set.of("a","b","c");  
//str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合  System.out.println(str1);  
Map<String,Integer>str2=Map.of("a",1,"b",2);  
System.out.println(str2);  
List<String>str3=List.of("a","b");  
System.out.println(str3);  
    }  
} 

需要注意以下两点:

1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如 HashSet,ArrayList等待;

2:返回的集合是不可变的;

2.2 Debug追踪


使用IDEA的断点调试功能,查看程序的运行过程

  1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

第三章 模拟斗地主洗牌发牌


3.1 案例介绍


按照斗地主的规则,完成洗牌发牌的动作。

具体规则:

  1. 组装54张扑克牌将
  2. 54张牌顺序打乱
  3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
  4. 查看三人各自手中的牌(按照牌的大小排序)、底牌

规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

3.2 案例需求分析


  1. 准备牌:
  2. 完成数字与纸牌的映射关系:

使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。

  1. 洗牌:

通过数字完成洗牌发牌发牌:

将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

存放的过程中要求数字大小与斗地主规则的大小对应。

将代表不同纸牌的数字分配给不同的玩家与底牌。


看牌:

通过Map集合找到对应字符展示。

通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。

3.3 实现代码步骤


publicclassPoker {
publicstaticvoidmain(String[] args) {
/** 1组装54张扑克牌*/// 1.1 创建Map集合存储HashMap<Integer, String>pokerMap=newHashMap<Integer, String>();
// 1.2 创建 花色集合 与 数字集合ArrayList<String>colors=newArrayList<String>();
ArrayList<String>numbers=newArrayList<String>();
// 1.3 存储 花色 与数字Collections.addAll(colors, "♦", "♣", "♥", "♠");
Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
// 设置 存储编号变量intcount=1;
pokerMap.put(count++, "大王");
pokerMap.put(count++, "小王");
// 1.4 创建牌 存储到map集合中for (Stringnumber : numbers) {
for (Stringcolor : colors) {
Stringcard=color+number;
pokerMap.put(count++, card);
            }
        }
/** 2 将54张牌顺序打乱*/// 取出编号 集合Set<Integer>numberSet=pokerMap.keySet();
// 因为要将编号打乱顺序 所以 应该先进行转换到 list集合中ArrayList<Integer>numberList=newArrayList<Integer>();
numberList.addAll(numberSet);
// 打乱顺序Collections.shuffle(numberList);
// 3 完成三个玩家交替摸牌,每人17张牌,最后三张留作底牌// 3.1 发牌的编号// 创建三个玩家编号集合 和一个 底牌编号集合ArrayList<Integer>noP1=newArrayList<Integer>();
ArrayList<Integer>noP2=newArrayList<Integer>();
ArrayList<Integer>noP3=newArrayList<Integer>();
ArrayList<Integer>dipaiNo=newArrayList<Integer>();
// 3.2发牌的编号for (inti=0; i<numberList.size(); i++) {
// 获取该编号Integerno=numberList.get(i);
// 发牌// 留出底牌if (i>=51) {
dipaiNo.add(no);
            } else {
if (i%3==0) {
noP1.add(no);
                } elseif (i%3==1) {
noP2.add(no);
                } else {
noP3.add(no);
                }
            }
        }
// 4 查看三人各自手中的牌(按照牌的大小排序)、底牌// 4.1 对手中编号进行排序Collections.sort(noP1);
Collections.sort(noP2);
Collections.sort(noP3);
Collections.sort(dipaiNo);
// 4.2 进行牌面的转换// 创建三个玩家牌面集合 以及底牌牌面集合ArrayList<String>player1=newArrayList<String>();
ArrayList<String>player2=newArrayList<String>();
ArrayList<String>player3=newArrayList<String>();
ArrayList<String>dipai=newArrayList<String>();
// 4.3转换for (Integeri : noP1) {
// 4.4 根据编号找到 牌面 pokerMapStringcard=pokerMap.get(i);
// 添加到对应的 牌面集合中player1.add(card);
        }
for (Integeri : noP2) {
Stringcard=pokerMap.get(i);
player2.add(card);
        }
for (Integeri : noP3) {
Stringcard=pokerMap.get(i);
player3.add(card);
        }
for (Integeri : dipaiNo) {
Stringcard=pokerMap.get(i);
dipai.add(card);
        }
//4.5 查看System.out.println("令狐冲:"+player1);
System.out.println("石破天:"+player2);
System.out.println("鸠摩智:"+player3);
System.out.println("底牌:"+dipai);
    }
}
相关文章
|
20天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
35 3
|
20天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
60 3
|
20天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
47 2
|
20天前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
70 2
|
1天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
6 2
|
1天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
5天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
5天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
5天前
|
Java 开发者
|
10天前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
13 1
下一篇
无影云桌面