集合
注:黄色为接口,白色为实现类
在集合(上)常见知识点总结中已经介绍了Collection中的各种集合,现在开始介绍Map接口下的集合
一、Map接口
Map(映射)不能包含重复的键,每个键最多映射一个值
interface Map<K,V> K:键的类型 V:值的类型
(1)基本方法
方法 | 说明 |
---|---|
V put(K key, V value) | 将键与值相关联(若不存在创建,若键存在覆盖掉值) |
V get(Object key) | 根据键获取对应的值 |
V remove(Object key) | 根据键删除键值对 |
void clear() | 删除所有键值对 |
boolean containsKey(Object key) | 判断是否包含指定键 |
boolean containsValue(Object value) | 判断是否包含指定值 |
boolean isEmpty() | 判断是否为空 |
int size() | 键值对数量 |
Set< K> keySet() | 获取所有键的集合 |
Collection< V> values() | 获取所有值的集合 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
(2)遍历集合
/**
* 集合的遍历
*/
public class MapTest {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("A","a");
map.put("B", "b");
map.put("C", "c");
/**
* 方法一:键找值
*/
// 获取key集合
Set<String> keySet = map.keySet();
for (String key : keySet) {
// 获取value值
String value = map.get(key);
System.out.println(key+","+value);
}
/**
* 方法二:键值对对象找键和值
*/
// 获取所有键值对
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
// 获取key和value
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+","+value);
}
/**
* 方法三:使用foreach方法
*/
map.forEach((k,v)->{
System.out.println(k+","+v);
});
}
}
二、HashMap集合
Person为key,String为value
为保证key唯一性,需要重写Person类中的equals和hashCode方法
代码示例:
public class HashMapTset {
public static void main(String[] args) {
Person p1 = new Person("小明", 5);
Person p2 = new Person("小红", 6);
Person p3 = new Person("小爱", 10);
// 定义与p3相同的p4
Person p4 = new Person("小爱", 10);
// 定义HashMap集合
HashMap<Person, String> person = new HashMap<>();
// 添加键值对
person.put(p1, "上海");
person.put(p2, "北京");
person.put(p3, "广州");
// 会将小爱更新为青岛
person.put(p4, "青岛");
// 遍历集合
Set<Person> keySet = person.keySet();
for (Person key : keySet) {
String value = person.get(key);
System.out.println(key.getName()+","+key.getAge()+","+value);
}
}
}
三、ArrayList集合嵌套HashMap集合
代码示例:
public class Test1 {
public static void main(String[] args) {
// 创建ArrayList集合
ArrayList<HashMap<String, String>> list = new ArrayList<>();
// 创建HashMap集合
HashMap<String, String> map1 = new HashMap<>();
map1.put("星星", "月亮");
map1.put("天空", "海洋");
HashMap<String, String> map2 = new HashMap<>();
map2.put("弟弟", "哥哥");
map2.put("父亲", "母亲");
HashMap<String, String> map3 = new HashMap<>();
map3.put("牛郎", "织女");
map3.put("周瑜", "小乔");
// 添加进ArrayList集合
list.add(map1);
list.add(map2);
list.add(map3);
// 遍历ArrayList集合
for (HashMap<String, String> map : list) {
// 遍历HashMap集合
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
System.out.println(key + "," + value);
}
}
}
}
四、HashMap集合嵌套ArrayList集合
代码示例:
public class Test2 {
public static void main(String[] args) {
// 创建HashMap集合
HashMap<String, ArrayList<String>> map = new HashMap<>();
// 创建ArrayList集合
ArrayList<String> list1 = new ArrayList<>();
list1.add("汤姆");
list1.add("杰瑞");
ArrayList<String> list2 = new ArrayList<>();
list2.add("熊大");
list2.add("熊二");
ArrayList<String> list3 = new ArrayList<>();
list3.add("红果果");
list3.add("绿泡泡");
// 添加集合
map.put("猫和老鼠", list1);
map.put("熊出没", list2);
map.put("智慧树", list3);
// 遍历HashMap集合
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key+":");
ArrayList<String> values = map.get(key);
// 遍历ArrayList集合
for (String value : values) {
System.out.println(value);
}
}
}
}
五、统计字符个数并排序
代码示例:
/**
* 统计字符个数
*/
public class Test3 {
public static <map> void main(String[] args) {
System.out.println("请输入字符串");
Scanner sc = new Scanner(System.in);
String line = sc.next();
// 创建HashMap集合
HashMap<Character, Integer> map = new HashMap<>();
// 字符统计
for (int i = 0; i < line.length(); i++) {
char key = line.charAt(i);
Integer value = map.get(key);
// 创建键值对
if (value == null) {
map.put(key, 1);
} else {
value++;
map.put(key, value);
}
}
// 排序
// 创建ArrayList集合
ArrayList<Map.Entry<Character, Integer>> lists = new ArrayList<>(map.entrySet());
lists.sort(new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
// 从大到小
return o2.getValue() - o1.getValue();
}
});
// 遍历集合
for (Map.Entry<Character, Integer> list : lists) {
System.out.println(list.getKey() + "," + list.getValue());
}
}
}
- 构造方法:
ArrayList(Collection<? extends E> c)
构造一个包含指定集合的元素的列表 - 更新索引项的简化操作
// 将把key与1关联,否则使用Integer::sum函数组合原值和1(也就是将原值与1求和)
map.merge(key, 1,Integer::sum);