文章目录
Map
1.1 Map集合概述和使用
Map集合描述
- Interface Map<K,V> K:键的类型 V:值的类型
- 将键映射到值的对象;不能包含重复的对象;每个键可以映射到最多一个值
- 举例:学生的学号和对象
id0001 张三
id0002 李四
id0003 王五
创建Map集合对象
- 多态的方式
- 具体的实现类HashMap
范例:
package com.fun01;
import java.util.HashMap;
import java.util.Map;
/**
* @author 23389.
* @date 2021/6/26.
*/
/*
Map集合描述
- Interface Map<K,V> K:键的类型 V:值的类型
- 将键映射到值的对象;不能包含重复的对象;每个键可以映射到最多一个值
- 举例:学生的学号和对象
id0001 张三
id0002 李四
id0003 王五
创建Map集合对象
- 多态的方式
- 具体的实现类HashMap
*/
public class MapDemo01 {
public static void main(String[] args) {
//创建Map集合对象
Map<String,String> map = new HashMap<String,String>();
//添加集合元素 V put(K key, V value)
map.put("id0001","张三");
map.put("id0002","李四");
map.put("id0003","王五");
//修改
map.put("id0003","刘六");
//输出map
System.out.println(map);
}
}
1.2 Map集合的基本功能
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对应元素 |
void clear() | 移除所有键值对应元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键值 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合重键值对的元素 |
范例:
package com.fun01;
import java.util.HashMap;
import java.util.Map;
/**
* @author 23389.
* @date 2021/6/26.
*/
/*
| 方法名 | 说明 |
| ----------------------------------- | ------------------------------------ |
| V put(K key,V value) | 添加元素 |
| V remove(Object key) | 根据键删除键值对应元素 |
| void clear() | 移除所有键值对应元素 |
| boolean containsKey(Object key) | 判断集合是否包含指定的键值 |
| boolean containsValue(Object value) | 判断集合是否包含指定的值 |
| boolean isEmpty() | 判断集合是否为空 |
| int size() | 集合的长度,也就是集合重键值对的元素 |
*/
public class MapDemo02 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
// V put(K key,V value) | 添加元素 |
map.put("郭靖", "黄蓉");
map.put("杨过", "小龙女");
map.put("张无忌", "赵敏");
//| V remove(Object key) | 根据键删除键值对应元素 |
//System.out.println(map.remove("杨过"));
// void clear() | 移除所有键值对应元素 |
// map.clear();
//| boolean containsKey(Object key) | 判断集合是否包含指定的键值 |
// System.out.println(map.containsKey("张无忌"));
// System.out.println(map.containsKey("张三"));
// | boolean containsValue(Object value) | 判断集合是否包含指定的值
// System.out.println(map.containsValue("小龙女"));
// System.out.println(map.containsValue("小改改"));
// | boolean isEmpty() | 判断集合是否为空
// System.out.println(map.isEmpty());
// | int size() | 集合的长度,也就是集合中键值对的元素 |
System.out.println(map.size());
System.out.println(map);
}
}
1.3 Map集合的获取功能
方法名 | 说明 |
---|---|
V get(Object key) | 根据键获取值 |
Set keySet() | 获取所有键的集合 |
Collection values() | 获取所有值的集合 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
1.4 Map集合的遍历(方式一)
我们刚才存储的元素都是成对出现的,所以我们把Map看出是一个夫妻的集合
遍历思路:
- 把所有的丈夫集中起来
- 遍历丈夫的集合,获取每一个丈夫
- 根据丈夫去找到对应的妻子
装换成Map集合中的操作:
- 获取所有键的集合,用keySet()方法实现
- 遍历键的集合,获取每一个键,用增强for实现
- 根据键去找值,用get(Object key)方法实现
package com.fun02;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author 23389.
* @date 2021/6/26.
*/
/*
*/
public class MapDemo01 {
public static void main(String[] args){
Map<String,String> map = new HashMap<String,String>();
map.put("刘备","孙尚香");
map.put("吕布","貂蝉");
map.put("杨过","小龙女");
Set<String> set = map.keySet();
for(String key : set){
String value = map.get(key);
System.out.println(key + "," + value);
}
System.out.println(map);
}
}
1.5 Map集合的遍历(方式二)
我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻的集合
遍历思路:
- 获取所有结婚证的集合
- 遍历结婚证的集合,得到每一个结婚证
- 根据结婚证获取丈夫和妻子
转换为Map集合后中的操作
- 获取所有键值对对象的集合
Set<Map.Entry<K,V>> entrySet() :获取所有键值对对象的集合
- 遍历键值对对象的集合,得到每一个键值对对象
用增强for循环实现,得到每一个Map.Entry
-
根据键值对对象获取键和值
用getKey()得到键
用getValue()得到值
package com.fun02; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * @author 23389. * @date 2021/6/26. */ /* 遍历思路: - 获取所有结婚证的集合 - 遍历结婚证的集合,得到每一个结婚证 - 根据结婚证获取丈夫和妻子 转换为Map集合后中的操作 - 获取所有键值对对象的集合 Set<Map.Entry<K,V>> entrySet() :获取所有键值对对象的集合 - 遍历键值对对象的集合,得到每一个键值对对象 用增强for循环实现,得到每一个Map.Entry - 根据键值对对象获取键和值 用getKey()得到键 用getValue()得到值 */ public class MapDemo02 { public static void main(String[] args){ Map<String,String> map = new HashMap<String,String>(); map.put("项羽","虞姬"); map.put("刘备","孙尚香"); map.put("吕布","貂蝉"); Set<Map.Entry<String, String>> entrySet = map.entrySet(); for(Map.Entry<String, String> me: entrySet){ String key = me.getKey(); String value = me.getValue(); System.out.println(key + "," + value); } } }
1.4 HashMap集合存储学生对象并遍历
需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student),存储三个键值元素,并遍历
思路:
①定义学生类
②创建HashMap集合对象
③创建学生对象
④把学生对象添加到集合
⑤遍历集合
方式1:键找值
方式2:键值对对象找键和值
package com.fun03;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author 23389.
* @date 2021/6/27.
*/
public class HashMapDemo {
public static void main(String[] args) {
Map<String, Student> map = new HashMap<String, Student>();
Student s1 = new Student("张山", 18);
Student s2 = new Student("李四", 19);
Student s3 = new Student("王五", 20);
map.put("10001", s1);
map.put("10002", s2);
map.put("10003", s3);
Set<String> set = map.keySet();
for (String key : set) {
Student student = map.get(key);
System.out.println(key + "," + student.getName() + "," + student.getAge());
}
System.out.println("-----------");
Set<Map.Entry<String, Student>> entrySet = map.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.5HashMap集合存储学生对象并遍历
需求:创建一个HashMap集合,键是学生对象(Student),值是居住地(String).存储多个键值对对象,并遍历
要求:保证键的唯一性:如果学生对象的成员变量值相同,我们认为是同一个对象。
思路:
①定义学生类
②创建HashMap集合对象
③创建学生对象
④把学生对象添加到集合
⑤遍历集合
方式1:键找值
方式2:键值对对象找键和值
⑥在学术类中重写两个方法
hashCode()
equals()
package com.fun04;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author 23389.
* @date 2021/6/27.
*/
public class HashMapDemo {
public static void main(String[] args) {
HashMap<Student,String> hm = new HashMap<Student,String>();
Student s1 = new Student("林曼玉",30);
Student s2 = new Student("小龙女",25);
Student s3 = new Student("柳岩",20);
Student s4 = new Student("柳岩",20);
hm.put(s1,"武汉");
hm.put(s2,"广州");
hm.put(s3,"西安");
hm.put(s4,"浙江");
Set<Student> set = hm.keySet();
for(Student s : set){
String value = hm.get(s);
System.out.println(s.getName() + "," + s.getAge() + "," + value);
}
System.out.println("----------");
Set<Map.Entry<Student, String>> entrySet = hm.entrySet();
for(Map.Entry<Student, String> me : entrySet){
Student key = me.getKey();
String value = me.getValue();
System.out.println(key.getName() + "," + key.getAge() + "," + value);
}
}
}
1.6ArrayList集合存储HashMap
需求:创建一个ArrayList集合,存储三个元素,都是HashMap,每一个HashMap的键和值都是String类型,并遍历
思路:
①创建ArrayList集合
②创建HashMap集合,并添加键值对元素
③把HashMap作为元素添加到ArrayList集合
④遍历ArrayList集合
package com.fun05;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author 23389.
* @date 2021/6/27.
*/
public class AyyayListDemo {
public static void main(String[] args) {
ArrayList<HashMap<String,String>> arr = new ArrayList<HashMap<String,String>>();
HashMap<String,String> map1 = new HashMap<String,String>();
HashMap<String,String> map2 = new HashMap<String,String>();
HashMap<String,String> map3 = new HashMap<String,String>();
map1.put("孙策","大乔");
map1.put("周瑜","小乔");
map2.put("郭靖","黄蓉");
map2.put("杨过","小龙女");
map3.put("令狐冲","任盈盈");
map3.put("林平之","岳灵珊");
arr.add(map1);
arr.add(map2);
arr.add(map3);
for(HashMap<String,String> map : arr){
Set<String> set = map.keySet();
for(String key : set){
String value = map.get(key);
System.out.println(key + "," + value);
}
}
}
}
1.7 HashMap集合存储ArrayList元素并遍历
需求:创建一个HashMap集合,存储三个键值对元素,每一个键值对元素的键都是String,值是ArrayList,
每一个ArrayList集合的元素是String,遍历
思路:
1.第一个ArrayList集合的元素:(三国演义)
诸葛亮
赵云
2.第二个ArrayList集合的元素:(水浒传)
武松
鲁智深
3.第三个ArrayList集合的元素:(西游记)
孙悟空
唐僧
package com.fun05;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
/**
* @author 23389.
* @date 2021/6/27.
*/
public class HashMapIncludeArrDemo {
public static void main(String[] args) {
HashMap<String,ArrayList<String>> hs = new HashMap<String,ArrayList<String>>();
ArrayList<String> arr1 = new ArrayList<String>();
ArrayList<String> arr2 = new ArrayList<String>();
ArrayList<String> arr3 = new ArrayList<String>();
arr1.add("诸葛亮");
arr1.add("赵云");
arr2.add("武松");
arr2.add("鲁智深");
arr3.add("孙悟空");
arr3.add("唐僧");
hs.put("三国演义",arr1);
hs.put("水浒传",arr2);
hs.put("西游记",arr3);
Set<String> keySet = hs.keySet();
for(String key : keySet){
System.out.println(key);
ArrayList<String> list = hs.get(key);
for(String s : list){
System.out.println("\t" + s);
}
}
}
}
1.8统计字符串中每个字符出现的次数
需求:键盘录入一个字符串,要求统计字符串每个字符出现的次数。
举例: 键盘录入“aababcabcdabcde” 在控制台输出a(5) b(4) c(3) d(2) e(1)
分析:
①我们可以把结果分成几个部分来看:a(5) ,b(4) ,c(3) ,d(2), e(1)
②每一个部分可以看成是键值对:字符和对应的次数组成
③这样的数据,我们可以通过HashMap集合来存储,键是字符,值是字符出现的次数
注意:键是字符,类型应该是Character,值是字符出现的次数,类型应该是Integer
思路:
①键盘录入一个字符串
②创建HashMap集合,键是Character,值是Integer
③遍历字符串,得到每一个字符
④拿得到的每一个字符作为HashMap集合中去找对应的值,看起返回值
如果返回值为null,说明该字符在HashMap集合中不存在,就把该字符作为键,1为值存储
如果返回值不为null,说明该字符在HashMap集合中存在,把该值加1,然后重写存储该字符和对应的值
⑤遍历HashMap集合,得到键和值,按要求进行拼接
⑥输出结果
package com.fun06;
import sun.reflect.generics.tree.Tree;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
/**
* @author 23389.
* @date 2021/6/27.
*/
public class HashMapDemo {
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
//创建HashMap集合对象
// HashMap<Character,Integer> hm = new 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){
hm.put(key,1);
}else{
value++;
hm.put(key,value);
}
}
StringBuilder sb = new StringBuilder();
Set<Character> keySet = hm.keySet();
for(Character key : keySet){
Integer value = hm.get(key);
sb.append(key).append("(").append(value).append(")");
}
String result = sb.toString();
System.out.println(result);
}
}