可重复键值 Map - TableMap
# 可重复键值 Map - TableMap
简介
TableMap
是 Hutool 提供的一种支持重复键值对的特殊 Map
实现。与标准的 Map
不同,TableMap
允许存在重复的键和值,类似于一个二维表格结构。通过 TableMap
,可以实现键值对的一一对应关系,并支持正向查找和反向查找。由于底层实现依赖于列表遍历查找,所以在数据量较大时性能相对较低。
# 1. 使用场景
在实际开发中,有时需要处理键值对之间存在多对多关系的场景。例如,一个学生可能选修多门课程(同一键对应多个值),或多名学生选修同一门课程(同一值对应多个键)。TableMap
便是针对这种需求设计的。
# 2. 主要方法
# 2.1 构造方法
TableMap
支持通过指定的 Map
实现来创建实例,如 HashMap
、LinkedHashMap
等。
TableMap(Map<K, List<V>> map)
:使用指定的Map
作为底层实现,创建一个TableMap
实例。
# 示例:创建 TableMap
import cn.hutool.core.map.TableMap;
import java.util.HashMap;
public class TableMapExample {
public static void main(String[] args) {
// 使用 HashMap 作为底层实现创建 TableMap
TableMap<String, Integer> tableMap = new TableMap<>(new HashMap<>());
// 添加键值对
tableMap.put("aaa", 111);
tableMap.put("bbb", 222);
// 根据键查找值
System.out.println("根据键 'aaa' 查找值: " + tableMap.get("aaa")); // 111
// 根据值反向查找键
System.out.println("根据值 222 查找键: " + tableMap.getKey(222)); // bbb
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 参数说明:
map
: 用于构建TableMap
的底层Map
实现。
- 作用:创建一个支持重复键值对的
TableMap
,可以根据具体需求选择合适的Map
实现。 - 实际开发场景:在需要处理多对多映射关系时,如用户与角色、学生与课程之间的关系,可以使用
TableMap
。
# 2.2 插入与获取元素
TableMap
提供了 put
方法插入键值对,并通过 get
和 getKey
方法分别实现正向查找和反向查找。此外,还支持获取多个值或多个键的场景。
# 示例:插入与获取元素
import cn.hutool.core.map.TableMap;
import java.util.HashMap;
import java.util.List;
public class TableMapExample {
public static void main(String[] args) {
// 创建 TableMap
TableMap<String, Integer> tableMap = new TableMap<>(new HashMap<>());
// 添加键值对
tableMap.put("aaa", 111);
tableMap.put("bbb", 222);
// 根据键查找值
Integer value = tableMap.get("aaa");
System.out.println("键 'aaa' 对应的值: " + value); // 111
// 根据值反向查找键
String key = tableMap.getKey(222);
System.out.println("值 222 对应的键: " + key); // bbb
// 获取所有与键 'aaa' 对应的值
List<Integer> values = tableMap.getValues("aaa");
System.out.println("键 'aaa' 对应的所有值: " + values); // [111]
// 获取所有与值 111 对应的键
List<String> keys = tableMap.getKeys(111);
System.out.println("值 111 对应的所有键: " + keys); // [aaa]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 方法签名:
V put(K key, V value)
:插入键值对。V get(K key)
:根据键查找值。K getKey(V value)
:根据值反向查找键。List<V> getValues(K key)
:获取与指定键对应的所有值。List<K> getKeys(V value)
:获取与指定值对应的所有键。
- 参数说明:
key
: 插入的键,或用于查找的键。value
: 插入的值,或用于反向查找的值。
- 返回值:
put
方法返回被覆盖的旧值(如果存在)。get
和getKey
方法返回查找到的值或键。getValues
和getKeys
方法返回与键或值对应的所有列表。
- 作用:实现键值对的插入和双向查找,支持多对多关系的映射。
- 实际开发场景:在需要维护重复键值对的场景中,如学生与课程、用户与权限的关系,可以使用
TableMap
进行管理。
# 2.3 处理重复键值对
在 TableMap
中,重复的键或值会被存储为列表。与标准的 Map
不同,TableMap
允许一个键对应多个值,一个值对应多个键。
# 示例:处理重复键值对
import cn.hutool.core.map.TableMap;
import java.util.HashMap;
import java.util.List;
public class TableMapExample {
public static void main(String[] args) {
// 创建 TableMap
TableMap<String, Integer> tableMap = new TableMap<>(new HashMap<>());
// 添加重复的键值对
tableMap.put("aaa", 111);
tableMap.put("aaa", 222); // 键 "aaa" 对应多个值
tableMap.put("bbb", 111); // 值 111 对应多个键
// 获取键 "aaa" 对应的所有值
List<Integer> values = tableMap.getValues("aaa");
System.out.println("键 'aaa' 对应的所有值: " + values); // [111, 222]
// 获取值 111 对应的所有键
List<String> keys = tableMap.getKeys(111);
System.out.println("值 111 对应的所有键: " + keys); // [aaa, bbb]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 作用:展示在处理重复键值对的情况下,
TableMap
的行为。TableMap
允许一个键对应多个值,或一个值对应多个键,适用于需要存储多对多关系的场景。
# 3. 实际应用场景
- 多对多映射:在需要维护多对多关系的场景中,如课程与学生、角色与权限的关系,
TableMap
提供了一种简洁的解决方案。 - 数据管理与处理:在需要处理存在重复键值对的数据时,
TableMap
提供了灵活的查找和管理方式。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08