如何使用Map的值键替换Key Value

时间:2013-08-22 05:11:23

标签: java

我想编写一个方法,将地图作为参数,并用值和键替换该地图的键和值。我想这样做:

public class HashMapKeyValueInterchange{
       public static Map<String, String> getMyMap(ConcurrentHashMap<String, String> m){
           Map<String, String> map2 = new HashMap<String, String>();
           for(Entry<String, String> e:m.entrySet()){
               map2.put(e.getValue(), e.getKey());
           }
           return map2;
       }

       public static void main(String[] args) {
           ConcurrentHashMap<String, String> map1 = new ConcurrentHashMap<String, String>();
           map1.put("ajay", "btech");
           map1.put("manas", "mca");
           map1.put("ashu", "mba");
       }    
}

使用这个方法,我可以得到一个带有交换键和值的新地图(map2),但我想要交换map1

4 个答案:

答案 0 :(得分:2)

可用,无需重新发明轮子,如果您使用谷歌收藏库番石榴,那么您可以使用BiMap<K,V>

  

这是一张保留其价值的唯一性的地图   它的钥匙。此约束使bimaps能够支持   “逆视图”,这是另一个包含相同条目的bimap   这个bimap,但有反向键和值。

BiMap的实施是EnumBiMap, EnumHashBiMap, [HashBiMap][2], ImmutableBiMap

答案 1 :(得分:0)

如果问题是代码是否有效,答案是肯定的。一些评论:

  1. 如果您希望对代码进行测试,则需要使用map1或其他适当的参数调用getMyMap
  2. 如果您想查看任何输出,则需要编写类似System.out.println( getMyMap( map1 ) );
  3. 的内容
  4. 我强烈建议您使用Map代替ConcurrentHashMap作为getMyMap的第一个参数类型,因此该功能更为通用,适用于其他地图。
  5. 为了使您的代码更加通用,请将其设为:

    public static <K,V> void getMyMap(Map<V,K> output,Map<K,V> input) {
        for(Entry<K,V> e: input.entrySet() ) {
            output.put(e.getValue(), e.getKey());
        }
    }
    

    这将接受更多种类的Map并将输出存储在任何类型的Map中作为第一个参数传递。例如:

    getMyMap(new TreeMap<String,String>(),map1);
    getMyMap(new HashMap<String,String>(),map1);
    
  6. 最后一点是,在重复值时不指定行为。上面的假设是这种情况不会发生,或者输入映射中的任何键都可以作为输出值中的值接受。

答案 2 :(得分:0)

使用此代码

public static ConcurrentHashMap<String, String> getMyMap(ConcurrentHashMap<String, String> m){
       ConcurrentHashMap<String, String> map2 = new ConcurrentHashMap<String, String>();
       for(Entry<String, String> e:m.entrySet()){
            map2.put(e.getValue(), e.getKey());
       }
       return map2;
}
public static void main(String[] args) {
    ConcurrentHashMap<String, String> map1 = new ConcurrentHashMap<String, String>();
    map1.put("ajay", "btech");
    map1.put("manas", "mca");
    map1.put("ashu", "mba");
    map1 = getMyMap(map1);
}

答案 3 :(得分:0)

BiMap是进行此类操作的不错选择

  

BiMap是一张地图       允许您使用inverse()查看“逆”BiMap       确保值是唯一的,使values()成为Set

如果您尝试将密钥映射到已存在的值,

BiMap.put(key, value)将抛出IllegalArgumentException 。如果您希望删除任何具有指定值的预先存在的条目,请改用BiMap.forcePut(key, value)

BiMap<String, Integer> userId = HashBiMap.create();
String userForId = userId.inverse().get(id);

查看here了解更多信息