这篇文章是哈希表基础的最后一节,本篇文章我们学习map。
map的基本介绍:
我们常常把map
称之为映射,就是将一个元素(通常称之为key
键)与一个相对应的值(通常称之为value
)关联起来,比如说一个学生的姓名(key
)有与之对应的成绩(value
),或者说一把钥匙(key
)对应一扇门value
, 键和值是一一对应的,在map
中键是唯一的,也有一个唯一的与之对应的值。
在 Java 中,Map
是一种接口(java.util.Map
),主要用于存储和管理键值对数据,使用Map
可以方便的进行查找操作,Map
接口的常见实现类包括 HashMap
、TreeMap
、LinkedHashMap
等,最常用的就是HashMap,即基于哈希表实现map。
例如:
创建一个HashMap
实例,需要指定键的类型和值的类型,键为String
类型,而值为Integer
类型。
// 创建一个HashMap实例,用于表示学生分数
Map<String, Integer> studentScores = new HashMap<>();
map的基本操作:
创建、添加、删除、查找为map的基本操作。
map结构常见使用方法:
put(key, value)
:将指定的键和值添加到map
中,如果键已存在,则替换对应的值。get(key)
:根据key
获取对应的值value
。remove(key)
:根据key
移除对应的键值对。containsKey(key)
:检查map
中是否包含key
键。containsValue(value)
:检查map
中是否包含value
值。- size():返回HashMap中键值对的数量。
- isEmpty():判断HashMap是否为空。
- clear():移除HashMap中的所有键值对。
keySet()
:返回包含所有键的集合。values()
:返回包含所有值的集合。entrySet()
:返回包含所有键值对的集合。
注意:
补充一个方法:getOrDefault
在HashMap的get方法中,如果没有给定的键值存在,或者给定键对应的值为null,该方法会返回null。这是因为HashMap允许值为null的情况。
如果你需要确定给定的键值是否存在,可以使用containsKey方法进行检查。它将返回一个布尔值,指示HashMap中是否包含指定的键。
另外,如果你希望在获取值时,如果键不存在或者键对应的值为null时返回一个默认值,可以使用getOrDefault方法。该方法接收两个参数,第一个参数是要获取的键,第二个参数是默认值。如果指定的键不存在或者键对应的值为null,将返回默认值。
例如:
HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", null);
String value1 = map.get("key1"); // 返回"value1"
String value2 = map.get("key3"); // 返回null
String value3 = map.getOrDefault("key3", "defaultValue"); // 返回"defaultValue"
请注意,如果错误地将null作为键传递给get方法,它将返回null,但这并不表示给定的null键存在于HashMap中。
补充:
如果想要遍历map
映射中的所有键值对,可以使用for-each
循环。
// 遍历映射中的所有键值对
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
int key = entry.getKey();
int door = entry.getValue();
System.out.println(key + "对应的房间是" + door);
}
Map.Entry
一般用于表示键值对,包括键值对,定义了getKey()
和getValue()
两个方法。
Map.Entry<Integer, Integer>
:指定了键和值的类型都是Integer
hashMap.entrySet()
返回一个包含Map
中所有键值对的集合,每个元素都是一个 Map.Entry
对象
int key = entry.getKey()
:这一行代码将当前迭代的键(entry.getKey()
)赋值给 key
变量,表示键的内容。
int door = entry.getValue()
:这一行代码将当前迭代的值(entry.getValue()
)赋值给 door
变量,表示值的内容。
例题:开房门
题目描述:
假设你手里有一串钥匙,这串钥匙上每把钥匙都有一个编号,对应着一个房门的编号。现给你一个房门编号,你需要判断是否能够打开该房门。
输入描述:
测试数据共有多组。
第一行为一个整数 s,表示共有多少组测试数据。
每组第一行有一个整数 n,表示钥匙串上有多少把钥匙。
后面共有 n 行输入,每行两个整数,第一个整数 k 表示钥匙编号,第二个整数 d 表示房门编号。
最后一行有一个整数 x,表示需要打开的房门编号。
输出描述:
输出多组,每组占一行。 如果能打开,则输出钥匙编号,不能打开则输出“Can't open the door.”。
输入示例:
2
5
878788 9373833
837837 3837378
378338 3398939
388733 2329389
878373 3938399
3938399
3
998389 3892393
444323 3892783
883782 5334332
8739833
输出示例:
878373
Can't open the door.
以下是完整代码:
import java.util.Map;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int s = scanner.nextInt();
for (int i = 0; i < s; i++) {
int n = scanner.nextInt();
Map<Integer, Integer> hashMap = new HashMap<>(); // 新建 map
for (int j = 0; j < n; j++) {
int key = scanner.nextInt();
int door = scanner.nextInt();
hashMap.put(door, key); // 将 键值对 放入到 map中
}
int closedDoor = scanner.nextInt();
// 获取 map的key的集合,并判断key是否在集合中
if (hashMap.keySet().contains(closedDoor)) {
System.out.println(hashMap.get(closedDoor)); // 根据key获取对应的值value
} else {
System.out.println("Can't open the door.");
}
}
scanner.close();
}
}
附:以上内容均来自卡码网Java基础课,若有侵权,将在第一时间删除。