HashMultimap 빠른 시작

HashMultimap 빠른 시작

클래스 상속 관계

이미지-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> 객체를 사용하여 구현하므로 위의 key2와 같이 value의 값은 자동으로 중복 제거되며, set 출력 시 중복 요소는 제거됩니다.

위 실행 결과:

//输出集合对象
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를 사용하여 삭제하면 모든 중복 요소가 삭제됩니다.예를 들어 위의 삭제 값이 1이면 삭제 후 출력은 다음과 같습니다.

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

key1의 모든 1이 삭제되고 key2와 해당 값도 삭제됩니다.

요소 교체

전체 값을 새 컬렉션으로 바꾸려면 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
for (Object value : multimap.values()) {
    
    
	System.out.println(value);
}

출력 결과:

333
222
111
1
10
3
4
6

키에 해당하는 값을 출력합니다.

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

출력 결과:

333
222
111

모든 키와 해당 값을 출력합니다.

//输出所有 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

모든 키 출력

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() 메서드는 중복 제거 후 키 값과 값의 수를 출력합니다.

keySet() 메서드는 모든 키 값을 출력합니다.

모든 값 출력

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]

출력은 각 키의 고유 요소이며 여러 키 중 동일한 요소가 출력됩니다.

추천

출처blog.csdn.net/dedede001/article/details/129949752