您现在的位置是:主页 > news > 网站设计在营销中的作用/seo教程自学
网站设计在营销中的作用/seo教程自学
admin2025/6/15 17:14:22【news】
简介网站设计在营销中的作用,seo教程自学,网站建设需求分析的功能,苏州保洁公司招聘保洁区域经理上一篇博客:List、Set、数据结构初步、Collections 目录 Map集合 Map常用子类Map接口中的常用方法Map集合遍历键找值方式Entry键值对对象Map集合遍历键值对方式HashMap存储自定义类型键值LinkedHashMapMap集合训练 补充知识点 JDK9对集合添加的优化Debug追踪 斗地主…
上一篇博客:List、Set、数据结构初步、Collections
目录
- Map集合
- Map常用子类
- Map接口中的常用方法
- Map集合遍历键找值方式
- Entry键值对对象
- Map集合遍历键值对方式
- HashMap存储自定义类型键值
- LinkedHashMap
- Map集合训练
- 补充知识点
- JDK9对集合添加的优化
- Debug追踪
- 斗地主升级排序版
开始
一、Map集合
1.1 概述
Java.util.Map接口专门提供集合类来存放一一对应、映射关系的对象
类似Python中的字典,键值对
前面的Collection接口:定义了单列集合规范,每次存储单个元素
这里的Map接口:定义了双列集合与Collection接口下的集合,他们存储数据的形式不同,每次存储一对元素
注意的是,Map中集合不能包含重复的键,值可以重复,每个键只能对应一个值
1.2 Map常用子类
Map接口有很多子类,主要学习HashMap集合、LinkedHashMap集合
HashMap<K,V>
:存储数据结构采用哈希表结构(数组+链表、红黑树),元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()
方法、equals()
方法。LinkedHashMap<K,V>
:HashMap下有个子类LinkedHashMap,存储结构采用哈希表+链表(数组+链表、红黑树+链表)结构。由于要保证键的唯一、不重复,需要重写键的hashCode()
方法、equals()
方法。
注意:Map接口中的集合都有两个泛型变量<K,V>
,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>
的数据类型可以相同,也可以不同。
1.3 Map接口中的常用方法
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。public V get(Object key)
根据指定的键,在Map集合中获取对应的值。boolean containsKey(Object key)
判断集合中是否包含指定的键。public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合中。public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
- 使用举栗:
package Demo_20;import java.util.HashMap;
import java.util.Map;public class Demo_01_Map {public static void main(String[] args) {//Map<String,String> map = new Map<String,String>();//报错,Map是接口Map<String,String> map1 = new HashMap<>();HashMap<String,String> map2 = new HashMap<>();map1.put("如此生活三十年","直到大厦崩塌");map1.put("保卫她的生活","直到大厦崩塌");map1.put("河北师大附中","乒乓少年奔向我");System.out.println(map1);//{河北师大附中=乒乓少年奔向我, 保卫她的生活=直到大厦崩塌, 如此生活三十多年=直到大厦崩塌}System.out.println(map1.remove("保卫她的生活"));//直到大厦崩塌System.out.println(map1);//{如此生活三十年=直到大厦崩塌, 河北师大附中=乒乓少年奔向我}System.out.println(map1.get("如此生活三十年"));//直到大厦崩塌System.out.println(map1.get("河北师大附中"));//乒乓少年奔向我}
}注意:
使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中; 若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
1.4 Map集合遍历键找值方式
键找值的方式:
- 获取Map中所有的键,键唯一,返回一个Set集合存储所有的键:
Set<String> keys = map.keySet();
- 遍历键的Set集合,得到每一个键
- 根据遍历的每个键,获取值:
String value = map.get(key);
举栗:
package Demo_20;import java.util.HashMap;
import java.util.Set;public class Demo_02_getValuesByKey {public static void main(String[] args) {HashMap<String,String> map = new HashMap<>();map.put("胡歌","霍建华");map.put("郭德纲","于谦");map.put("薛之谦","大张伟");Set<String> keys = map.keySet();for (String key : keys) {String value = map.get(key);System.out.println(key + "的CP是:" + value);}}
}郭德纲的CP是:于谦薛之谦的CP是:大张伟胡歌的CP是:霍建华
1.5 Entry键值对对象
存储的一对键值对又叫Entry(项),在遍历Map
集合时,就可以从每一个键值对(Entry
)对象中获取对应的键与对应的值。
既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey()
:获取Entry对象中的键。public V getValue()
:获取Entry对象中的值。
在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
简单理解就是:直接把项看成一个整体,遍历后,在调用项的方法获取键、值
1.6 Map集合遍历键值对方式
- 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回:
Set<Entry<String,String>> entrySet = map.entrySet();
- 遍历Set集合,得到一个单独的Entry对象:
for (Entry<String, String> entry : entrySet){ }
- 通过键值对(Entry)对象,获取Entry对象中的键与值:
String key = entry.getKey();
String value = entry.getValue();
举栗:
package Demo_20;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Demo_03_getValuesByEntry {public static void main(String[] args) {HashMap<String,String> map = new HashMap<>();map.put("胡歌","霍建华");map.put("郭德纲","于谦");map.put("薛之谦","大张伟");Set<Map.Entry<String,String>> entrySet = map.entrySet();for (Map.Entry<String, String> entry : entrySet) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + "的cp是:" + value);}}}郭德纲的cp是:于谦薛之谦的cp是:大张伟胡歌的cp是:霍建华
注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
1.7 HashMap存储自定义类型(对象)键值
-
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。
-
注意,学生姓名相同并且年龄相同视为同一名学生。
-
代码:
package Demo_20;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Demo_04_TestMain {public static void main(String[] args) {//对象作为键Map<Student,String> map = new HashMap<Student,String>();map.put(new Student("张三",18),"上海");map.put(new Student("李四",19),"北京");map.put(new Student("赵六",21),"广州");map.put(new Student("王五",20),"深圳");//获取键的集合Set<Student> keySet = map.keySet();for (Student key : keySet) {String value = map.get(key);System.out.println(key.toString()+"......"+value);}}}
- 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。
- 如果要保证map中存放的key和取出的顺序一致,可以使用
java.util.LinkedHashMap
集合来存放。
1.8 LinkedHashMap
HashMap保证成对元素唯一,并且查询速度很快,但是元素无序
LinkedHashMap是HashMap的子类,可实现元素有序
public class LinkedHashMapDemo {public static void main(String[] args) {LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();map.put("邓超", "孙俪");map.put("李晨", "范冰冰");map.put("刘德华", "朱丽倩");Set<Entry<String, String>> entrySet = map.entrySet();for (Entry<String, String> entry : entrySet) {System.out.println(entry.getKey() + " " + entry.getValue());}}
}邓超 孙俪
李晨 范冰冰
刘德华 朱丽倩
1.9 Map集合训练
-
计算一个字符串中每个字符出现的次数
-
分析:
- 创建一个字符串对象
- 创建Map集合,键代表字符,值代表次数
- 遍历字符串得到每个字符
- 判断Map中是否有该键
- 如果没有,第一次出现,存储次数为1
- 如果有,说明已经出现过,获取对应的次数值++,再次存储
- 打印结果
- 代码:
package Demo_20;import java.util.HashMap;
import java.util.Scanner;public class Demo_05_MapExercises {public static void main(String[] args) {System.out.println("请输入一个字符串:");Scanner sc = new Scanner(System.in);String s =sc.next();findChar(s);}private static void findChar(String s) {//创建Map集合HashMap<Character,Integer> map = new HashMap<>();//循环遍历字符串for(int i = 0;i<s.length();i++){//为了判断依次取出字符char c = s.charAt(i);//如果字符 不存在 键集中if(!map.containsKey(c)){map.put(c,1);} else {//否则就是已经出现过一次了Integer count = map.get(c);//计数++,计入值集map.put(c, ++count);}}System.out.println(map);}}
二、补充知识点
2.1 JDK9对集合添加的优化
-
通常,集合(List、Set)添加元素需要
list、Set.add("元素")
一个一个加 -
Java 9 中,添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的List、Set、Map的静态工厂方法可以更方便的创建集合的不可变实例
-
注意:
of()
方法只是Map
,List
,Set
这三个接口的静态方法,其父类接口Collection和子类实现类HashSet,ArrayList,HashMap等并没有这类方法 -
返回的集合是不可变的
-
举栗
package Demo_20;import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;public class Demo_06_AddMenbersMethod {public static void main(String[] args) {Set<? extends Serializable> a = Set.of("a", "d", "c", 1);System.out.println(a);Set<String> s = Set.of("a", "c", "b");//s.add("f");//编译不报错,执行报错UnsupportedOperationException//因为是不可变得集合System.out.println(s);Map<String,Integer> map = Map.of("a",1,"b",2);System.out.println(map);List<String> list = List.of("a","b");System.out.println(list);}}
2.2 Debug追踪
使用IDEA的断点调试功能,查看程序的运行过程
-
在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序
-
点击Debug运行模式
-
程序停止在断点上不再执行,而IDEA最下方打开了Debug调试窗口
-
Debug调试窗口介绍
-
快捷键F8,代码向下执行一行,第九行执行完毕,执行到第10行(第10行还未执行)
-
切换到控制台面板,控制台显示 请录入一个字符串: 并且等待键盘录入
-
切换到控制台面板,控制台显示 请录入一个字符串: 并且等待键盘录入
回车之后效果:
调试界面效果:
-
此时到达findChar方法,快捷键F7,进入方法findChar
-
快捷键F8 接续执行,创建了map对象,变量区域显示
-
快捷键F8 接续执行,进入到循环中,循环变量i为 0,F8再继续执行,就获取到变量c赋值为字符‘a’ 字节值97
-
快捷键F8 接续执行,进入到判断语句中,因为该字符 不在Map集合键集中,再按F8执行,进入该判断中
-
快捷键F8 接续执行,循环结束,进入下次循环,此时map中已经添加一对儿元素
-
快捷键F8 接续执行,进入下次循环,再继续上面的操作,我们就可以看到代码每次是如何执行的了
-
如果不想继续debug,那么可以使用快捷键F9,程序正常执行到结束,程序结果在控制台显示
三、斗地主升级排序版
3.1 案例介绍
按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
- 组装54张扑克牌将
- 54张牌顺序打乱
- 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
- 查看三人各自手中的牌(按照牌的大小排序)、底牌
规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
3.2 案例需求分析
- 准备牌:
完成数字与纸牌的映射关系:
使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
- 洗牌:
通过数字完成洗牌发牌
- 发牌:
将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
存放的过程中要求数字大小与斗地主规则的大小对应。
将代表不同纸牌的数字分配给不同的玩家与底牌。
- 看牌:
通过Map集合找到对应字符展示。
通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。
3.3 代码实现
package Demo_20;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;public class Demo_07_PokerPlus {public static void main(String[] args) {//1. 组装54张牌//1.1 创建Map集合HashMap<Integer,String> pokerMap = new HashMap<Integer,String>();//1.2 创建 花色集合 数字集合ArrayList<String> colors = new ArrayList<>();ArrayList<String> numbers = new ArrayList<>();//1.3 存储 花色 数字Collections.addAll(colors,"♥","♠","♣","♦");Collections.addAll(numbers,"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");// 设置存储编号数量int count = 1;pokerMap.put(count++,"大王");pokerMap.put(count++,"小王");//1.4 创建牌 存储到Map集合//54个键,54个牌//for (String color : colors) {//for (String number : numbers) {//String card = color + number;//pokerMap.put(count++,card);//}//}//这里顺序不能变,否则排序不正确,按照图案为标准,不按照牌的数字for (String number : numbers) {for (String color : colors) {String card = number + color;pokerMap.put(count++,card);}}//2. 牌打乱顺序//取出编号键集合Set<Integer> numberSet = pokerMap.keySet();//编号需要打乱顺序,要先 Set集合 转换到 List集合中ArrayList<Integer> numberList = new ArrayList<>();numberList.addAll(numberSet);//打乱Collections.shuffle(numberList);//3. 完成三个玩家摸牌,最后三张是底牌//3.1 发牌的编号//创建三个玩家编号集合、一个底牌集合ArrayList<Integer> noP1 = new ArrayList<Integer>();ArrayList<Integer> noP2 = new ArrayList<Integer>();ArrayList<Integer> noP3 = new ArrayList<Integer>();ArrayList<Integer> diPaiNo = new ArrayList<Integer>();//3.2 发牌的编号for(int i = 0;i< numberList.size();i++){//获取编号Integer no = numberList.get(i);if (i >= 51) {diPaiNo.add(no);} else {if (i % 3 == 0) {noP1.add(no);} else if (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 = new ArrayList<String>();ArrayList<String> player2 = new ArrayList<String>();ArrayList<String> player3 = new ArrayList<String>();ArrayList<String> diPai = new ArrayList<String>();// 4.3转换for (Integer i : noP1) {// 4.4 根据编号找到 牌面 pokerMapString card = pokerMap.get(i);// 添加到对应的 牌面集合中player1.add(card);}for (Integer i : noP2) {String card = pokerMap.get(i);player2.add(card);}for (Integer i : noP3) {String card = pokerMap.get(i);player3.add(card);}for (Integer i : diPaiNo) {String card = pokerMap.get(i);diPai.add(card);}//4.5 查看System.out.println("卢本伟:"+player1);System.out.println("PDD:"+player2);System.out.println("大司马:"+player3);System.out.println("底牌:"+diPai);}}
参考:B站黑马