Ari的小跟班

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::
  65 随笔 :: 1 文章 :: 1 评论 :: 15044 阅读

按照Value排序的HashMap

直接上代码:

import java.util.*;
public class ValueSortedMap<K, V extends Comparable<V>> extends TreeMap<K, V> {
private static final long serialVersionUID = 1L;
private TreeMap<V, Set<K>> valueKeyMap;
public ValueSortedMap() {
super();
valueKeyMap = new TreeMap<>();
}
public ValueSortedMap(Comparator<? super V> comparator) {
super();
valueKeyMap = new TreeMap<>(comparator);
}
@Override
public V put(K key, V value) {
if (containsKey(key)) {
V oldValue = get(key);
valueKeyMap.get(oldValue).remove(key);
if (valueKeyMap.get(oldValue).isEmpty()) {
valueKeyMap.remove(oldValue);
}
}
Set<K> existedSet = valueKeyMap.get(value);
if (Objects.isNull(existedSet)) {
HashSet<K> tempSet = new HashSet<>(Collections.singletonList(key));
valueKeyMap.put(value, tempSet);
}else{
existedSet.add(key);
}
return super.put(key, value);
}
public TreeMap<V, Set<K>> getValueKeyMap() {
return valueKeyMap;
}
}

用法:

public static void main(String[] args){
ValueSortedMap<String, Integer> map = new ValueSortedMap<>();
map.put("One", 1);
map.put("Three", 3);
map.put("Two", 2);
map.put("Three",0);
map.put("Three",-2);
map.put("Four",1);
System.out.println(map.get("Three"));
TreeMap<Integer, Set<String>> valueKeyMap = map.getValueKeyMap();
for (Map.Entry<Integer, Set<String>> entry : valueKeyMap.entrySet()) {
Integer value = entry.getKey();
Set<String> keys = entry.getValue();//取的是set;因为同一个value可以有多个key存在。
for (String key : keys) {
System.out.println("Key: " + key + ", Value: " + value);
}
}
}

​ 遍历的时候通过 NavigableMap<Integer, Set<String>> valueKeyMap = map.getValueKeyMap();中的entrySet()进行遍历。其实就是在TreeMap的基础上再加一个用value作为键,Set作为值的TreeMap内部对象,该对象的值Set是value=键的key的集合。因为TreeMap默认是按照键排序的。

posted on   Ari的小跟班  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示