1. Map集合的概述和使用
Map集合概述:
- Interface <K,V> K:键的类型; V:值的类型
- 将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值
- 举例:学生的学号和姓名
学号(K) | 姓名(V) |
---|---|
201925463 | 小明 |
201925464 | 小张 |
201925465 | 小美 |
导包:
import java.util.HashMap;
import java.util.Map;
创建Map集合的对象:
- 多态的方式
- 具体的实现类HashMap
Map<String,String> map = new HashMap<String,String>();
map.put("001","小明"); //将指定的值与该映射中的指定键相关联
map.put("002","小明");
map.put("002","小张");
//以上map中只有两对元素(001小明,002小张),因为键的唯一性,map.put("002","小张")动作用002小张覆盖了002小明
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() | 集合的长度,也就是集合中键值对的个数 |
3. Map集合的获取功能
方法名 | 说明 |
---|---|
V get(Object key) | 根据键获取值 |
Set < K> keySet() | 获取所有键的集合 |
Collection< V> values() | 获取所有值的集合 |
Set< Map.Entry< K,V>> entrySet() | 获取所有键值对象的集合 |
Map<String,String> map = new HashMap<String,String>();
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);
4. Map集合的遍历
方式1:
- 用Set< K > keySet(),把Map集合中所有的key取出来存储到Set集合中
- 使用迭代器/增强for遍历Set集合,用get(key)
Map<String,String> map = new HashMap<String,String>();
Set<String> set = map.KeySet();
for(String s : set) {
String key = s;
String value = map.get(s);
方式2:
- 获取所有键值对对象集合,用 Set < Map.Entry < K,V>> entrySet() : 获取所有键值对对象的集合
- 遍历键值对对象集合,得到每一个键值对对象,用增强for实现得到每一个Map.Entry
- 根据键值对对象获取键和值,用getKey()得到键,用getValue()得到值
Map<String,String> map = new HashMap<String,String>();
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Map.Entry<String,String> me : entrySet) {
String key = me.getKey();
String value = me.getValue();
}
5. 集合嵌套
1.用ArrayList集合存储HashMap元素并遍历
//创建ArrayList集合
ArrayList<HashMap<String,String>> array = new ArrayList<>();
//创建HashMap集合,并添加键值对元素
HashMap<String,String> hm1 = new HashMap<String,String>();
hm1.put("1","one");
hm1.put("2","two");
//把HashMap集合作为元素添加到ArrayList集合
array.add(hm1);
HashMap<String,String> hm2 = new HashMap<String,String>();
hm2.put("1","一");
hm2.put("2","二");
//把HashMap集合作为元素添加到ArrayList集合
array.add(hm2);
HashMap<String,String> hm3 = new HashMap<String,String>();
hm3.put("1","yi");
hm3.put("2","er");
//把HashMap集合作为元素添加到ArrayList集合
array.add(hm3);
//遍历ArrayList集合
for(HashMap<String,String> hm : array) {
Set<String> keySet = hm,keySet();
for(String key : keySet) {
String value = hm.get(key);
System.out.println(key + "," + value);
}
}
2.HashMap集合存储ArrayList元素并遍历
//创建HashMap集合
HashMap<String,ArrayList<String>> hm = new HashMap<>();
//创建ArrayList集合,并添加元素
ArrayList<String> sgyy = new ArrayList<String>();
sgyy.add("诸葛亮");
sgyy.add("赵云");
//把ArrayList作为元素添加到HashMap集合中
hm.put("三国演义",sgyy);
ArrayList<String> xyj = new ArrayList<String>();
sgyy.add("孙悟空");
sgyy.add("唐曾");
//把ArrayList作为元素添加到HashMap集合中
hm.put("西游记",xyj);
ArrayList<String> shz= new ArrayList<String>();
sgyy.add("武松");
sgyy.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);
}
}
执行结果:
水浒传
- 武松
- 鲁智深
三国演义- 诸葛亮
- 赵云
西游记- 唐曾
- 孙悟空
案例:统计字符串中每个字符出现的次数
public class HashMapDemo{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String line = sc.nextLine();
//创建HashMap集合,键是Character,值是Integer
HashMap<Character,Integer> hm = new HashMap<>();
//遍历字符串,得到每一个字符
for(int i = 0; i< line.length(); i++){
char key = line.charAt();
//拿到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
Integer value = hm.get(key);
if(value == null) {
//如果返回值是null,说明字符在HashMap集合中不存在,就把该字符作为键,1作为值存储
hm.put(key,1);
} else {
//如果返回值不是null,说明该字符在HashMap集合中存在,把该值加1,然后重新存储该字符和对应的值
value++;
hm.put(key,value);
}
}
//遍历HashMap集合,得到键和值,按照要求进行拼接
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);
}
}
执行结果:
请输入一个字符串:
aaabacddbca
:
a(5)d(2)b(2)c(2)
注:HashMap中的元素没有顺序,通过上面的执行结果就能看出来。如果想把结果排序,可以把HashMap改成TreeMap,TreeMap用法跟HashMap一样,只是多了一个对元素的排序(这里的排序是它默认排序,可以改,我之间的文章有说到)
用TreeMap之后执行结果:
请输入一个字符串:
loveyou
:
e(1)l(1)o(2)u(1)v(1)y(1)
是的,没错,是按照字母字典顺序排序的。如果元素是整数的话,就是按照自然数的顺序排序。
:
:
:
主页还有更多Javase相关的笔记,欢迎大家指点评论