您现在的位置是:主页 > news > 网站设计在营销中的作用/seo教程自学

网站设计在营销中的作用/seo教程自学

admin2025/6/15 17:14:22news

简介网站设计在营销中的作用,seo教程自学,网站建设需求分析的功能,苏州保洁公司招聘保洁区域经理上一篇博客:List、Set、数据结构初步、Collections 目录 Map集合 Map常用子类Map接口中的常用方法Map集合遍历键找值方式Entry键值对对象Map集合遍历键值对方式HashMap存储自定义类型键值LinkedHashMapMap集合训练 补充知识点 JDK9对集合添加的优化Debug追踪 斗地主…

网站设计在营销中的作用,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集合遍历键找值方式

键找值的方式:

  1. 获取Map中所有的键,键唯一,返回一个Set集合存储所有的键: Set<String> keys = map.keySet();
  2. 遍历键的Set集合,得到每一个键
  3. 根据遍历的每个键,获取值: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集合遍历键值对方式

  1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回:Set<Entry<String,String>> entrySet = map.entrySet();
  2. 遍历Set集合,得到一个单独的Entry对象:for (Entry<String, String> entry : entrySet){ }
  3. 通过键值对(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集合训练

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

  • 分析:

  1. 创建一个字符串对象
  2. 创建Map集合,键代表字符,值代表次数
  3. 遍历字符串得到每个字符
  4. 判断Map中是否有该键
  5. 如果没有,第一次出现,存储次数为1
  6. 如果有,说明已经出现过,获取对应的次数值++,再次存储
  7. 打印结果
  • 代码:
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()方法只是MapListSet这三个接口的静态方法,其父类接口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的断点调试功能,查看程序的运行过程

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

  2. 点击Debug运行模式
    在这里插入图片描述

  3. 程序停止在断点上不再执行,而IDEA最下方打开了Debug调试窗口
    在这里插入图片描述

  4. Debug调试窗口介绍
    在这里插入图片描述

  5. 快捷键F8,代码向下执行一行,第九行执行完毕,执行到第10行(第10行还未执行)
    在这里插入图片描述

  6. 切换到控制台面板,控制台显示 请录入一个字符串: 并且等待键盘录入
    在这里插入图片描述

  7. 切换到控制台面板,控制台显示 请录入一个字符串: 并且等待键盘录入
    在这里插入图片描述

回车之后效果:
在这里插入图片描述

调试界面效果:在这里插入图片描述

  1. 此时到达findChar方法,快捷键F7,进入方法findChar
    在这里插入图片描述

  2. 快捷键F8 接续执行,创建了map对象,变量区域显示
    在这里插入图片描述

  3. 快捷键F8 接续执行,进入到循环中,循环变量i为 0,F8再继续执行,就获取到变量c赋值为字符‘a’ 字节值97
    在这里插入图片描述

  4. 快捷键F8 接续执行,进入到判断语句中,因为该字符 不在Map集合键集中,再按F8执行,进入该判断中
    在这里插入图片描述

  5. 快捷键F8 接续执行,循环结束,进入下次循环,此时map中已经添加一对儿元素
    在这里插入图片描述

  6. 快捷键F8 接续执行,进入下次循环,再继续上面的操作,我们就可以看到代码每次是如何执行的了
    在这里插入图片描述

  7. 如果不想继续debug,那么可以使用快捷键F9,程序正常执行到结束,程序结果在控制台显示
    在这里插入图片描述

三、斗地主升级排序版

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. 准备牌:

完成数字与纸牌的映射关系:

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

  1. 洗牌:

通过数字完成洗牌发牌

  1. 发牌:

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

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

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

  1. 看牌:

通过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站黑马