0

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

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

4 回答 4

2

它是可用的,无需重新发明轮子,如果您使用谷歌收藏库 Guava 则可以使用BiMap<K,V>.

它是一个保留其值的唯一性以及其键的唯一性的映射。此约束使 bimap 能够支持“反向视图”,这是另一个 bimap,包含与此 bimap 相同的条目,但具有相反的键和值。

的实施BiMapEnumBiMap, EnumHashBiMap, [HashBiMap][2], ImmutableBiMap

于 2013-08-22T05:18:08.877 回答
0

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

  1. 如果要测试代码,则需要getMyMap使用 map1 或其他适当的参数进行调用。
  2. 如果您想查看任何输出,则需要编写类似的内容System.out.println( getMyMap( map1 ) );
  3. 我强烈建议使用Map而不是ConcurrentHashMapasgetMyMap的第一个参数类型,因此该函数更通用,可与其他地图一起使用。
  4. 为了使您的代码更加通用,请使其:

    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's 并将输出存储为任何类型的Map作为第一个参数传递的。例子:

    getMyMap(new TreeMap<String,String>(),map1);
    getMyMap(new HashMap<String,String>(),map1);
    

最后一点是,当值重复时,您不指定行为。上面的假设是这种情况不会发生,或者输入映射中的任何键都可以作为输出中的值。

于 2013-08-22T05:19:29.413 回答
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);
}
于 2013-08-22T05:21:26.687 回答
0

BiMap 是此类操作的不错选择

BiMap 是一个允许您查看“反向”BiMap 的 Map,使用 inverse() 确保值是唯一的,从而使 values() 成为 Set

BiMap.put(key, value)IllegalArgumentException如果您尝试将键映射到已经存在的值,则会抛出一个。如果您希望删除具有指定值的任何预先存在的条目,请BiMap.forcePut(key, value)改用。

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

在这里查看更多信息

于 2013-08-22T05:44:07.887 回答