Java 从映射中反转哈希映射<;字符串,布尔值>;映射<;布尔值,列表<;字符串>&燃气轮机;

Java 从映射中反转哈希映射<;字符串,布尔值>;映射<;布尔值,列表<;字符串>&燃气轮机;,java,list,dictionary,arraylist,hashmap,Java,List,Dictionary,Arraylist,Hashmap,是否有更优雅/内置的方法来反转Hashmap的键和值 我目前有以下几点 private Map<Boolean, List<String>> reverseMap(Map<String, Boolean> permissions) { List<String> allow = new ArrayList<String>(); List<String> deny = new ArrayList<Strin

是否有更优雅/内置的方法来反转Hashmap的键和值

我目前有以下几点

private Map<Boolean, List<String>> reverseMap(Map<String, Boolean> permissions) {
    List<String> allow = new ArrayList<String>();
    List<String> deny = new ArrayList<String>();
    Map<Boolean, List<String>> returnvalue = new HashMap<Boolean, List<String>>();

    for (Entry<String, Boolean> entry : permissions.entrySet()) {
        if(entry.getValue()) {
            allow.add(entry.getKey());
        } else {
            deny.add(entry.getKey());
        }
    }

    returnvalue.put(true, allow);
    returnvalue.put(false, deny);
    return returnvalue;
}
私有映射反向映射(映射权限){
List allow=new ArrayList();
List deny=new ArrayList();
Map returnvalue=new HashMap();
对于(条目:permissions.entrySet()){
if(entry.getValue()){
allow.add(entry.getKey());
}否则{
deny.add(entry.getKey());
}
}
returnvalue.put(true,allow);
returnvalue.put(false,deny);
返回值;
}

> p>您可以考虑使用其中的一个实现。例如:

private Multimap<Boolean, String> reverseMap(Map<String, Boolean> permissions) {
   Multimap<Boolean, String> multimap = ArrayListMultimap.create();
   for (Map.Entry<String, Boolean> entry : permissions.entrySet()) {
      multimap.put(entry.getValue(), entry.getKey());
   }
   return multimap;
}
私有多重映射反向映射(映射权限){
Multimap Multimap=ArrayListMultimap.create();
对于(Map.Entry:permissions.entrySet()){
multimap.put(entry.getValue(),entry.getKey());
}
返回多重映射;
}
或者更一般地说:

private static <K, V> Multimap<V, K> reverseMap(Map<K, V> source) {
   Multimap<V, K> multimap = ArrayListMultimap.create();
   for (Map.Entry<K, V> entry : source.entrySet()) {
      multimap.put(entry.getValue(), entry.getKey());
   }
   return multimap;
}
private静态多重映射反转映射(映射源){
Multimap Multimap=ArrayListMultimap.create();
对于(Map.Entry:source.entrySet()){
multimap.put(entry.getValue(),entry.getKey());
}
返回多重映射;
}
< /代码> 我会做类似的事情(但是如果你必须经常做这种事情,考虑番石榴),只需用设置的列表替换(似乎更一致)并预先填充反映射:

private Map<Boolean, Set<String>> reverseMap(Map<String, Boolean> permissions) {
    Map<Boolean, Set<String>> returnvalue = new HashMap<Boolean, Set<String>>();
    returnvalue.put(Boolean.TRUE, new HashSet<String>());
    returnvalue.put(Boolean.FALSE, new HashSet<String>());
    for (Entry<String, Boolean> entry : permissions.entrySet()) 
        returnvalue.get(entry.getValue()).add(entry.getKey());
    return returnvalue;
}
私有映射反向映射(映射权限){
Map returnvalue=new HashMap();
returnvalue.put(Boolean.TRUE,new HashSet());
returnvalue.put(Boolean.FALSE,new HashSet());
对于(条目:permissions.entrySet())
returnvalue.get(entry.getValue()).add(entry.getKey());
返回值;
}

首先要注意的是,如果值仅为真或假,则实际上不需要反向映射。如果你有更广泛的价值观,这将是有意义的

获取具有特定值的条目的一种简单(但不是很优雅)方法是:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
     Set<T> keys = new HashSet<T>();
     for (Entry<T, E> entry : map.entrySet()) {
         if (entry.getValue().equals(value)) {
             keys.add(entry.getKey());
         }
     }
     return keys;
}
已经提供了一种方法来反转其键值对。也许您可以将相关的
映射
的界面更改为
BiMap
,或者使用以下代码:

private BiMap<Boolean, String> reverseMap(Map<String, Boolean> permissions) {
   BiMap<String, Boolean> bimap = HashBiMap.create(permissions);
   return bimap.inverse();
}
专用BiMap反向映射(映射权限){
BiMap BiMap=HashBiMap.create(权限);
返回bimap.inverse();
}

您真的需要布尔映射吗?只有两个可能的键(true和false)。两个集合,一个denyList和一个allowList怎么样?@Thilo-别忘了
null
:)但是,是的,我同意。我不认为按另一个映射中的值排序的
TreeMap
是个好主意-如果基映射的内容发生变化,那么
TreeMap
中的树将不一致,导致意外结果。我的意思是使用树映射而不是初始哈希映射,很抱歉造成混淆;-)如果要插入的树映射是
base
,则插入新内容时会出现空指针异常(因为
base.get(newKey)
将为空)。我认为您不能安全地将树映射按值排序:(编写一个适当的compare()方法作为家庭作业留给读者;-)顺便说一下,树映射调用这个比较方法,不会调用任何东西。树映射将使用比较器进行键查找,这将阻止映射正常工作。我不认为你可以用这种方式使用树形图-看看或确切地说我在找什么,谢谢:D
private BiMap<Boolean, String> reverseMap(Map<String, Boolean> permissions) {
   BiMap<String, Boolean> bimap = HashBiMap.create(permissions);
   return bimap.inverse();
}