❤️持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
🎨 个人介绍
👉大家好,我是:旺仔不是程序员
👉认真分享技术,记录学习过程的点滴,如果我的分享能为你带来帮助,请支持我奥🍻
👉你的支持,是我每天更新的动力。
👉赞点:👍 留言:✍ 收藏:⭐
👉个人格言:想法一步一步的落实,才是你我前进最佳选择。
1. Map集合
1.1 Map集合概述和特点
1 )Map 集合概述
interface Map<K,V> K : 键的类型 ; V : 值得类型
2 )Map 集合得特点
- 键值对映射关系
- 一个键对应一个值
- 键不能重复,值可以重复
- 元素存取无序
3 )Map 集合得基本使用
public class MapDemo01 {
//创建集合对象
Map<String, String> map = new HsahMap<String,String>();
map.put("itheima001","林青霞");
map.put("itheima002","张曼玉");
map.put("itheima003","王祖贤");
map.put("itheima003","柳岩");
// 输出集合对象
System.out.println(map);
}
1.2 Map 集合的基本功能
1 )方法介绍
| 方法名 | 说明 |
|---|---|
| V put(K key,V value) | 添加元素 |
| V remove(Object key) | 根据键删除键值对元素 |
| void clear() | 移除所有兼职的对元素 |
| boolean containKey(Object key) | 判断集合是否包含指定键 |
| boolean containKey(Object value) | 判断集合是否包含指定值 |
| Boolean isEmpty() | 判断集合是否为空 |
| int size() | 集合的长度,也就是集合中键值对的个数 |
2 )代码实例
public class MapDemo02 {
public static void main(String[] args) {
//创建集合对象
Map<String ,String> map = new HashMap<String ,String>();
//添加元素
map.put("张无忌","赵敏");
map.put("郭靖","蓉");
map.put("杨过","小龙女");
System.out.println(map);
//删除元素
System.out.println(map.remove("郭靖"));
System.out.println(map);
//移除所有元素
map.clear();
System.out.println(map);
//判断集合是否包含指定的键
System.out.println(map.containsKey("郭靖"));
System.out.println(map.containsKey("郭襄"));
//判断集合是否包含指定的值
System.out.println(map.containsValue("蓉"));
// 判断集合是否为空
System.out.println(map.isEmpty());
//集合的长度
System.out.println(map.size());
//输出集合对象
System.out.println(map);
}
}
1.3 Map集合的获取功能
1 )方法介绍
| 方法名 | 说明 |
|---|---|
| V get(Object key) | 根据键获取值 |
| Set keySet( ) | 获取所有的键的集合 |
| Collection values() | 获取所有值的集合 |
| Set<Map.Entry<K,V>>entrySet( ) | 获取所有键值对对象的集合 |
2 )实例代码
public static void main(String[] args) {
//创建对象
Map<String, String> map = new HashMap<String, String>();
//添加元素
map.put("张无忌", "赵敏");
map.put("郭靖", "黄蓉");
map.put("杨过", "小龙女");
//根据键获取值
System.out.println(map.get("张无忌"));
//获取键的集合,遍历集合
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.println(key);
}
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value);
}
}
1.4 Map 集合的遍历
1 )遍历思路
-
我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
- 把所有的丈夫给集中起来
- 遍历丈夫的集合,获取到每一个丈夫
- 根据丈夫找到对应的妻子
2 )分析步骤
- 获取所有键的集合。用keySet()方法实现
- 遍历键的集合,获取到每一个键。用增强for实现
- 根据键去找值。用get(Object key) 方法实现
3 )代码实现
public class MapDemo01 {
public static void main(String[] args) {
//创建集合对象
Map<String ,String> map = new HashMap<>();
//添加元素
map.put("张无忌", "赵敏");
map.put("郭靖", "黄蓉");
map.put("杨过", "小龙女");
//获取所有键的集合。用keySet()方法实现
Set<String> keySet = map.keySet();
//遍历键的集合,获取到每一个键,用增强for循环
for(String key : keySet) {
//根据键去找值
String value = map.get(key);
System.out.println(key + "=" + value);
}
}
}
1.5 Map 集合的遍历
1 )遍历思路
-
我们刚才存储的元素都是成对出现的,所以我们把Map看成一个夫妻对的集合
- 获取所有结婚证的集合
- 遍历结婚证的集合,得到每一个结婚证
- 根据结婚证获取丈夫和妻子
2 )步骤分析
-
获取所有键值对对象的集合
- Set<Map.Entry<K,V>>entrySet() : 获取所有键值对对象的集合
-
遍历键值对对象的集合,得到每一个键值对对象
- 用增强for实现,得到每一个Map.Entry
-
根据键值对对象获取键和值
- 用getKey() 得到键
- 用getValue()得到值
3 )代码思路
public class MapDemo02 {
public static void main(String[] args) {
}
}
1.6 Map 集合的案例
1.6.1 HashMap 集合练习之键是String值是Student
1 )案例需求
- 创建一个HashMap集合,键是学号(String),值是学生对象(Student)。存储三个键值对元素,并遍历
2 )代码实现
- 学生类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 测试类
public class HashMapDemo {
public static void main(String[] args) {
// 创建HashMap集合对象
HashMap<String,Student> hm = new HashMap<String,Student>();
//创建学生对象
Student s1 = new Student("林青霞", 30);
Student s2 = new Student("张曼玉", 35);
Student s3 = new Student("王祖贤", 33);
//把学生添加到集合
hm.put("itheima001", s1);
hm.put("itheima002", s2);
hm.put("itheima003", s3);
//方式1 : 键值对
Set<String> keySet = hm.keySet();
for(String key : keySet) {
Student value = hm.get(key);
System.out.println(key + "," + value.getName() + "," + value.getAge());
}
System.out.println("--------");
//方式2:键值对对象找键和值
Set<Map.Entry<String,Student> entrySet = hm.entrySet();
for(Map.Entry<String,Student> me : entrySet) {
String key = me.getKey();
Student value = me.getValue();
System.out.println(key + "," + value.getName() + "," + value.getAge());
}
}
}
1.6.2 HashMap 集合练习之键是student 值是String
1 )案例需求
- 创建一个HashMap集合,键是学生对象(Student),值是居住地(String),存储多个元素,并遍历。
- 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象
2 )代码示例
- 学生类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals (Object o) {
if(this == o) {
return true
}
if(o == null || getClass() != o.getClass()) {
return false;
}
Student student = (Student) o;
if(age != student.age) {
return false;
}
return name != null ? name.equals(Student.name) : student.name == null;
@Override
public int hashCode() {
int result = name !=null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
}
- 测试类
public class HashMapDemo {
public static void main(String[] args) {
//创建HashMap集合对象
HashMap<Student,String> hm = new HashMap<Student,String>();
//创建学生对象
Student s1 = new Student("林青霞", 30);
Student s2 = new Student("张曼玉", 35);
Student s3 = new Student("王祖贤", 33);
Student s4 = new Student("王祖贤", 33);
//把学生添加到集合
hm.put(s1, "西安");
hm.put(s2, "武汉");
hm.put(s3, "郑州");
hm.put(s4, "北京");
//遍历集合
Set<Student> keySet = hm.keySet();
for(Student key : keySet) {
String value = hm.get(key);
System.out.println(key.getName() + "," + key.getAge() + "," + value);
}
}
}
1.6.3 集合嵌套之ArrayList嵌套HashMap
1 )案例需求
- 创建一个ArrayList 集合,存储三个元素,每个元素都是HashMap
- 每一个HashMap 的键和值都是String ,并遍历
2 )代码实现
public class ArrayListIncludeHashDemo {
public static void main(String[] args) {
//创建ArrayList集合
ArrayList<HashMap<String,String>> array = new ArrayList<HashMap<HashMap<String,String>();
//创建HashMap集合,并添加键值对元素
HashMap<String,String> hml = new HashMap<String,String>();
hm1.put("孙策", "大乔");
hm1.put("周瑜", "小乔");
//把HashMap作为元素添加到ArrayList集合
array.add(hm1);
HashMap<String, String> hm2 = new HashMap<String, String>();
hm2.put("郭靖", "黄蓉");
hm2.put("杨过", "小龙女");
//把HashMap作为元素添加到ArrayList集合
array.add(hm2);
HashMap<String, String> hm3 = new HashMap<String, String>();
hm3.put("令狐冲", "任盈盈");
hm3.put("林平之", "岳灵珊");
//把HashMap作为元素添加到ArrayList集合
array.add(hm3);
//遍历ArrayList集合
for (HashMap<String, String> hm : array) {
Set<String> key = hm.keySet();
for(String key : keySet) {
String value = hm.get(key);
System.out.println(key + "," + value);
}
}
}
}
1.6.4 集合嵌套之HashMap嵌套ArrayList
1 )案例需求
- 创建一个HashMap集合,存储三个键值对元素,每个键值对元素的键是String,值是ArrayList
- 每个ArrayList的元素是String,并遍历
2 )代码实现
public class HashMapIncludeArrayListDemo {
public static void main(String[] args) {
//创建HashMap 集合
HashMap<String,ArrayList<String>> hm = new HashMap<String,ArrarList<String>>();
//创建ArrayList集合,并添加元素
ArrayList<String> sgyy = new ArrayList<String>();
sgyy.add("诸葛亮");
sgyy.add("赵云");
//把ArrayList作为元素添加到HashMap集合
hm.put("三国演义",sgyy);
ArrayList<String> xyj = new ArrayList<String>();
xyj.add("唐僧");
xyj.add("孙悟空");
//把ArrayList作为元素添加到HashMap集合
hm.put("西游记",xyj);
ArrayList<String> shz = new ArrayList<String>();
shz.add("武松");
shz.add("鲁智深");
//把ArrayList作为元素添加到HashMap集合
hm.put("水浒传",shz);
//遍历HashMap集合
set<String> keySet = hm.keySet();
for(String key : keySet) {
System.out.println(key);
ArrayList<String> value = hm.get(key);
for(String s : value) {
System.out.println("\t"+s);
}
}
}
}
1.6.5 统计字符串每个字符出现的次数
1 )案例需求
- 键盘录入一个字符串,要求统计字符串中每个字符串出现的次数
- 举例:键盘录入"aababcabcdabcde" 在控制台输出:“a(5)b(4)c(3)d(2)e(1)”
2 )代码实现
public class HashMapDemo {
public static void main(String[] args) {
//键盘录入一个字符串
Scanner input = new Scanner(System.in);
System.out.println("请输入一个字符串");
String line = input.nextLine();
//创建HashMap集合,键是Character,值是Integer
TreeMap<Character,Integer> hm = new TreeMap<Character,Integer>();
//遍历字符串得到每一个字符
for (int i = 0; i < line.length(); i++) {
char key = line.charAt(i);
//拿得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
Integer value = hm.get(key);
if (value == null) {
//如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1 作为值存储
hm.put(key,1);
}else {
value++;
hm.put(key,value);
}
}
}
}
2 .Collection集合工具类
2.1 Collection概述 和 使用
1 )Collection类的作用
- 是针对集合操作的工具
2 )Collection 类常用方法
| 方法名 | 说明 |
|---|---|
| public static void sort(List list) | 将指定的列表按升序排序 |
| public static void reverse(List<?> list) | 反转指定表中元素的顺序 |
| public static void shuffle(List<?> list) | 使用默认的随机源随机排列指定的列表 |
3 )示例代码
public class CollectionDemo01 {
public static void main(String[] args) {
// 创建集合对象
}
}
2.2 ArrayList 集合存储学生并排序
1 )案例需求
- ArrayList:存储学生对象,使用Collection 对ArrayList进行排序
- 需求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
2 )代码实现
- 学生类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 测试类
public class CollectionDemo02 {
public static void main(String[] args) {
// 创建ArrayList集合对象
ArrayList<Student> array = new ArrayList<Student>();
//创建学生对象
Student s1 = new Student("linqingxia", 30);
Student s2 = new Student("zhangmanyu", 35);
Student s3 = new Student("wangzuxian", 33);
Student s4 = new Student("liuyan", 33);
//把学生添加到集合
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
//使用Collections对ArrayList集合排序
//sort•(List<T> list, Comparator<? super T> c)
Collections.sort(array,new Comparator<student>() {
@Override
public int compare(Student s1,Student s2) {
//按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
int num = s1.getAge() - s2.getAge();
int num2 = num ==0 ? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});
//遍历集合
for(Student s : array) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}
3. 斗地主案例
1 )案例需求:
- 通过程序实现斗地主过程中的洗牌,发牌和看牌
2 )代码实现
public class PokerDemo {
public static void main(String[] args) {
//创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现
ArrayList<String> array = new ArrayList<String>();
//往牌盒里面装牌
//定义花色数组
String[] colors = {"♦", "♣", "♥", "♠"};
//定义点数数组
String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
for(String color : colors) {
for(String number : numbers) {
array.add(color + number);
}
}
array.add("大王");
array.add("小王");
//洗牌,也就是把牌打散,用Collections 的 shuffle()方法实现
Collections.shuffle(array);
//发牌就是遍历集合,给三个玩家发牌
ArrayList<String> lqxArray = new ArrayList<String>();
ArrayList<String> lyArray = new ArrayList<String>();
ArrayList<String> fqyArray = new ArrayList<String>();
ArrayList<String> dpArray = new ArrayList<String>();
for(int i = 0;i<array.size();i++) {
String poker = array.get(i);
if(i>= array.size() - 3 ) {
bottomArray.add(poker);
}else if(i % 3 == 0) {
lqxArray.add(poker);
}else if(i % 3 == 1) {
lyArray.add(poker);
} else if (i % 3 == 2) {
fqyArray.add(poker);
}
}
//看牌,也就是三个玩家分别遍历自己的牌
lookPoker("林青霞",lqxArray);
lookPoker("柳岩", lyArray);
lookPoker("风清扬", fqyArray);
lookPoker("底牌", dpArray);
}
/** 看牌的方法 */
public static void lookPoker(String name,ArrayList<String> array) {
System.out.print(name + "的牌是:");
for(String poker : array) {
System,out.print(poker + " ");
}
System.out.println();
}
}
4. 斗地主升级版本
1 )案例需求
- 通过程序实现斗地主的洗牌,发牌,和看牌:对牌进行排序
2 )代码实现
public static void main(String[] args) {
//创建HashMap, 键是编号,值是牌
HashMap<Integer, String> map = new HashMap<Integer, String>();
//创建ArrayList,存储编号
ArrayList<Integer> array = new ArrayList<Integer>();
//创建花色数组和点数数组
String[] colors = {"♦", "♣", "♥", "♠"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
//从0 开始 往HashMap里边存储编号,并存储对应的牌。同时往ArrayList里面存储编号
int index = 0;
for (String number : numbers) {
for (String color : colors ) {
map.put(index,number+color);
array.add(index);
index++;
}
}
map.put(index,"小王");
array.add(index);
index++;
map.put(index,"大王");
array.add(index);
// 洗牌用,Collections 的shuffle()方法实现
Collections.shuffle(array);
//发牌(发的是编号,为了保证编号是排序的,创建treeSet()集合接受
TreeSet<Integer> lqxSet = new TreeSet<>();
TreeSet<Integer> lySet = new TreeSet<>();
TreeSet<Integer> fqySet = new TreeSet<>();
TreeSet<Integer> bottomSet = new TreeSet<>();
for (int i = 0; i < array.size(); i++) {
Integer x = array.get(i);
if (i>=array.size() - 3) {
bottomSet.add(x);
}else if(i % 3==0) {
lqxSet.add(x);
}else if(i % 3==1) {
lySet.add(x);
}else if(i % 3==2) {
fqySet.add(x);
}
}
//调用看牌的方法
lookPoker("林青霞", lqxSet, map);
lookPoker("柳岩", lySet, map);
lookPoker("风清扬", fqySet, map);
lookPoker("底牌", bottomSet, map);
}
private static void lookPoker(String name ,TreeSet<Integer> ts, HashMap<Integer, String> map) {
System.out.println(name + "的牌是:");
for (Integer key : ts) {
String poker = map.get(key);
System.out.print(poker + " ");
}
System.out.println();
}
🎈看完了不妨给我点个赞吧,👉你的支持,是我每天更新的动力...