卡码网Java基础课--哈希表基础(3)--开房门例题

这篇文章是哈希表基础的最后一节,本篇文章我们学习map。

map的基本介绍:

我们常常把map称之为映射,就是将一个元素(通常称之为key键)与一个相对应的值(通常称之为value)关联起来,比如说一个学生的姓名(key)有与之对应的成绩(value),或者说一把钥匙(key)对应一扇门value, 键和值是一一对应的,在map中键是唯一的,也有一个唯一的与之对应的值。

在 Java 中,Map 是一种接口(java.util.Map),主要用于存储和管理键值对数据,使用Map可以方便的进行查找操作,Map 接口的常见实现类包括 HashMapTreeMapLinkedHashMap 等,最常用的就是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基础课,若有侵权,将在第一时间删除。

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值