假设有两个HashMap,他们的SIZE及KEY都是相等的,只有值不同,现在要把两个HashMap合并成一样,使得所有KEY相等的VALUE都能合并起来,也就是合并后的HashMap是之前两个的并集。
比如hm1.put("1","123") hm2.put("1","1234"),要使最后的结果为hm3("1","123,1234")
当然,value可能是空值,或者是一个LIST ,如hm1.put("1",list),而另一个是空值或者String或者也是 list。
不考虑 value也相等的情况,不知道有没有好的方法可以合并两个HashMap

解决方案 »

  1.   

    遍历map1 key的时候直接可以取map2对应key的value了
      

  2.   

    你告诉我list怎么合并。这里包含的情况太多了。
      

  3.   

    package com.xuz.csdn.june21;import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;public class HashMapMerge { public static void main(String[] args) {
    Map<String, String> map1 = new HashMap<String,String>();
    map1.put("vowel", "a");
    map1.put("consonant", "b");

    Map<String, String> map2 = new HashMap<String,String>();
    map2.put("vowel", "e");
    map2.put("consonant", "c");

    Map<String, String> map3 = new HashMap<String,String>();

    Iterator<String> keys = map1.keySet().iterator();
    while (keys.hasNext()) {
    String key = keys.next();
    map3.put(key, map1.get(key)+","+map2.get(key));
    }

    System.out.println(map3);
    }}
      

  4.   

    如果有List和String两种类型的Value,那还得加上instanceof判断,和list循环。难道这是一个好的设计么?
      

  5.   

    关于list这一段处理的并不合适,你要看你的数据到底是什么了,你自己处理下public static  void main(String[] args){
    Map<String,Object> map1=new HashMap<String,Object>();
    map1.put("1","123");
    map1.put("2",null);
    Map<String,Object> map2=new HashMap<String,Object>();
    map2.put("1","1234");
    List<String> list=new ArrayList<String>();
    list.add("fdssdf");
    map2.put("2",list);
    map2.put("3","werwe");
    Map<String,Object> map3=new HashMap<String,Object>();
    map3.putAll(map1);
    Set<String> set2=map2.keySet();
    for(String key:set2){
    if(map3.isEmpty()||!map3.containsKey(key)){
    map3.put(key,map2.get(key));
    }else{
    Object obj=map2.get(key);
    Object obj3=map3.get(key);
    if(obj3 instanceof String){
    if(obj instanceof String){
    map3.put(key, (String)obj+(String)obj3);
    }
    if(obj instanceof List){
    ((List)obj).add(obj);
    }
    }
    if(obj3 instanceof List){
    if(obj instanceof String){
    map3.put(key, (String)obj+(String)obj3);
    }
    if(obj instanceof List){
    ((List)obj).addAll((List)obj);
    }
    }
    if(obj3==null)
    map3.put(key,obj);
    }
    }

    System.out.println(map3);
    }
      

  6.   

    /**
    参见方法combineMap
    可以处理以下各种情形:
    1。两个value都是string
    2。两个value都是collection
    3。其中一个value是collection
    4。其中一个value是null
    5。两个value都是null
    **/import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;public class TestHashMap {

        public void test_combine_two_maps() {
         List<Object> list = new ArrayList<Object>();
         list.add("55");
        
         Map<String, Object> map1 = new HashMap<String,Object>();
         map1.put("1", "123");
         map1.put("2", list);
         map1.put("3", null);
         map1.put("4", null);
        
         Map<String, Object> map2 = new HashMap<String,Object>();
         map2.put("1", "1234");
         map2.put("2", "66");
         map2.put("3", "77");
         map2.put("4", null);
        
         Map map3 = combineMap(map1, map2);
         System.out.println("Map3: " + map3);
        }
        
        public Map<String, Object> combineMap(Map<String, Object> map1, Map<String, Object> map2) {
         if (map1 == null || map2 == null) return null;
         if (map1.size() != map2.size()) 
         throw new IllegalArgumentException("Maps must have the same size");
        
         Map<String, Object> map = new HashMap<String,Object>();
         Iterator<String> it = map1.keySet().iterator();
         while(it.hasNext()) {
         String key = it.next();
         Object value1 = map1.get(key);
         Object value2 = map2.get(key);
         Object value = null;
         if (value1 instanceof Collection) {
         if (value2 instanceof Collection) {
         value = ((Collection)value1).addAll((Collection)value2);
         }
         else {
         value = ((Collection)value1).add(value2);
         }
         }
         else if (value1 != null) {
         if (value2 instanceof Collection) {
         value = ((Collection)value2).add(value1);
         }
         else if (value2 != null) {
         value = value1 + ", " + value2;
         }
         else {
         value = value1;
         }
         }
         else {
         if (value2 != null) {
         value = value2;
         }
         else {
         value = null;
         }
         }
        
         map.put(key, value);
         }
         return map;
        } /**
     * @param args
     */
    public static void main(String[] args) {
    TestHashMap test = new TestHashMap();
    test.test_combine_two_maps();
    }
    }
      

  7.   

    /**
    参见方法combineMap
    可以处理以下各种情形:
    1。两个value都是string
    2。两个value都是collection
    3。其中一个value是collection
    4。其中一个value是null
    5。两个value都是null
    **/import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;public class TestHashMap {

        public void test_combine_two_maps() {
         List<Object> list = new ArrayList<Object>();
         list.add("55");
        
         Map<String, Object> map1 = new HashMap<String,Object>();
         map1.put("1", "123");
         map1.put("2", list);
         map1.put("3", null);
         map1.put("4", null);
        
         Map<String, Object> map2 = new HashMap<String,Object>();
         map2.put("1", "1234");
         map2.put("2", "66");
         map2.put("3", "77");
         map2.put("4", null);
        
         Map map3 = combineMap(map1, map2);
         System.out.println("Map3: " + map3);
        }
        
        public Map<String, Object> combineMap(Map<String, Object> map1, Map<String, Object> map2) {
         if (map1 == null || map2 == null) return null;
         if (map1.size() != map2.size()) 
         throw new IllegalArgumentException("Maps must have the same size");
        
         Map<String, Object> map = new HashMap<String,Object>();
         Iterator<String> it = map1.keySet().iterator();
         while(it.hasNext()) {
         String key = it.next();
         Object value1 = map1.get(key);
         Object value2 = map2.get(key);
         Object value = null;
         if (value1 instanceof Collection) {
         if (value2 instanceof Collection) {
         value = ((Collection)value1).addAll((Collection)value2);
         }
         else {
         value = ((Collection)value1).add(value2);
         }
         }
         else if (value1 != null) {
         if (value2 instanceof Collection) {
         value = ((Collection)value2).add(value1);
         }
         else if (value2 != null) {
         value = value1 + ", " + value2;
         }
         else {
         value = value1;
         }
         }
         else {
         if (value2 != null) {
         value = value2;
         }
         else {
         value = null;
         }
         }
        
         map.put(key, value);
         }
         return map;
        } /**
     * @param args
     */
    public static void main(String[] args) {
    TestHashMap test = new TestHashMap();
    test.test_combine_two_maps();
    }
    }
      

  8.   

    这个有点儿复杂
    不清楚你具体遇到了什么需求,需要这么做;
    对于map的value,如果是object,判断是否equals,需要你重写equals()方法;如果value是list,对于list中的object也需要这样,得事先知道所存object的class,挺麻烦。