HashMultimap 快速入门

HashMultimap 快速入门

类继承关系

image-20230404101720634

构造器私有,不能直接new方法创建,类提供create方法创建对象

//构造器
private HashMultimap() {
    super(new HashMap());
}

private HashMultimap(int expectedKeys, int expectedValuesPerKey) {
    super(Maps.newHashMapWithExpectedSize(expectedKeys));
    Preconditions.checkArgument(expectedValuesPerKey >= 0);
    this.expectedValuesPerKey = expectedValuesPerKey;
}

private HashMultimap(Multimap<? extends K, ? extends V> multimap) {
    super(Maps.newHashMapWithExpectedSize(multimap.keySet().size()));
    this.putAll(multimap);
}

//创建对象方法
public static <K, V> HashMultimap<K, V> create() {
    return new HashMultimap();
}

public static <K, V> HashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
    return new HashMultimap(expectedKeys, expectedValuesPerKey);
}

public static <K, V> HashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
    return new HashMultimap(multimap);
}

创建演示

// 创建一个默认的 HashMap<String, Set<Integer>>,容器的初始化容量与HashMap的默认值一样
HashMultimap<String, Integer> multimap = HashMultimap.create();

// 当我们知道容器的个数时,推荐使用下面这种方式, 
// HashMap 设置容量为8, 每个HashSet的容量初始化为16
HashMultimap<String, Integer> multimap2 = HashMultimap.create(8, 16);

// 另外一个就是基于MultMap来创建的case了
HashMultimap<String, Integer> multimap3 = HashMultimap.create(multimap);

添加元素

// 添加单个元素
multimap.put("key1", 110);

// 添加多个元素
multimap.putAll("key2", Arrays.asList(1,4,3,6,3,10,5,5,1,2));
multimap.putAll("key3", Arrays.asList(1,4,3,6,3,10));

底层使用HashMap<K,HashSet>对象实现,因此value的值会自动去重,例如上面的key2,输出集合时会去除重复元素。

上述执行输出结果:

//输出集合对象
System.out.println(multimap);
//输出每个key里不重复的元素,多个key中相互之间有相同元素也会输出
System.out.println(multimap.values());
{key2=[1, 2, 3, 4, 5, 6, 10], key3=[1, 10, 3, 4, 6]}
[1, 2, 3, 4, 5, 6, 10, 1, 10, 3, 4, 6]

删除元素

// 移除skill对应的集合中,value=3的元素
multimap.remove("key1", 1);

// 移除key
multimap.removeAll("key2");

使用remove删除时会删除所有重复元素,例如上述删除 value 为 1 ,则删除后输出:

{key1=[2, 3, 4, 5, 6, 10]}

所有 key1 中的 1 被删除, key2 和 对应的 value 也都被删除。

替换元素

如果我们希望将整个value都换成一个新的集合,那么可以使用 replaceValue()

// 直接替换 key1 对应的 value 集合,新的值为 {100, 200, 300}
multimap.replaceValues("key1", Arrays.asList(111, 222, 333));

输出结果:

{key1=[333, 222, 111]}

获取元素及遍历

获取元素

// 获取对应的value集合,当不存在时,返回空集合(不会返回 null)
Set<Object> set = multimap.get("key1");
Set<Object> set1 = multimap.get("key2");// key2上面已经删除
System.out.println(set);
System.out.println(set1);

输出结果为:

[333, 222, 111]
[]

遍历

将上面删除的 key2 打开,可根据需求使用不同的方式遍历:

// 输出所有的 value:

// 输出所有的 value
for (Object value : multimap.values()) {
	System.out.println(value);
}

输出结果:

333
222
111
1
10
3
4
6

输出对应 key 的 value:

//输出对应 key 的 value
for (Object value : multimap.get("key1")) {
	System.out.println(value);
}

输出结果:

333
222
111

输出所有 key 及对应的 value:

//输出所有 key 及对应的 value
for (Map.Entry<Object, Object> entry : multimap.entries()) {
	System.out.println(entry.getKey() + ":" + entry.getValue());
}

输出结果:

key1:333
key1:222
key1:111
key2:1
key2:10
key2:3
key2:4
key2:6

输出所有的key

multimap.putAll("key1", Arrays.asList(1, 4, 3, 6, 3, 10, 5, 5, 1, 2));
multimap.putAll("key2", Arrays.asList(1, 4, 3, 6, 3, 10));

Multiset<Object> keys = multimap.keys();
Set<Object> objects = multimap.keySet();

System.out.println(keys);
System.out.println(objects);

输出结果:

[key1 x 7, key2 x 5]
[key1, key2]

keys()方法输出的是 key 值和 value 去重后的个数;

keySet()方法输出所有 key 值。

输出所有的value

multimap.putAll("key1", Arrays.asList(1, 4, 3, 6, 3, 10, 5, 5, 1, 2));
multimap.putAll("key2", Arrays.asList(1, 4, 3, 6, 3, 10));

Collection<Object> values1 = multimap.values();

System.out.println(values1);

输出结果:

[1, 2, 3, 4, 5, 6, 10, 1, 10, 3, 4, 6]

输出的是每个 key 中不重复的元素,多个 key 之间相同的元素会输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

earlytrain9653

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值