java求几个hashmap中key的并集,输出value

问题描述

java求几个hashmap中key的并集,输出value

现有几个hashmap,可能有相同的key,但是value不同,求key的并集,
并输出在不同hashmap中的不同value,若不存在则为-1

比如hashmap1{(我,1),(你,2),(他,3),(它,4)}
hashmap2{(猴,1)(狗,3)(你,4)(他,5)}
hashmap3{(猴,10)(牛,2)(狗,5)(猪,4),(它,8)}
hashmap4{(我,5),(牛,6)}
输出为
key hashmap1 hashmap2 hashmap3 hashmap4
我 1 -1 -1 5
你 2 4 -1 -1
他 3 5 -1 -1
它 4 -1 8 -1
猴 -1 1 10 -1
狗 -1 3 5 -1
牛 -1 -1 2 6
猪 -1 -1 4 -1

解决方案

思路是挨个挨个Map遍历,将结果放入一个汇总的map,希望有更漂亮的方案


import java.util.*;

public class MapMerge {
    public static void main(String[] args) {
        List<HashMap<String,Integer>> list = generate();
        HashMap<String,String> result = new HashMap<>();
        HashMap<String,Integer> tmpmap = new HashMap<>();
        //循环遍历每个Map,合并成一个大的map
        for (int i = 0; i < list.size(); i++) {
            //遍历Map中的每一个元素
            tmpmap = list.get(i);
            if(tmpmap==null||tmpmap.size()<1){
                continue;
            }
            Iterator<String> it = tmpmap.keySet().iterator();
            while(it.hasNext()){
                String key = it.next();
                Integer value = tmpmap.get(key);
                //如果在结果中已经存在key,
                if(result.containsKey(key)){
                    //该键已经统计过了
                }else{
                    //前i个hashmap里面没有值,把剩下的hashmap的值挨个取出.
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < i; j++) {
                        sb.append(";-1");
                    }

                    for (int j = i; j < list.size(); j++) {
                        sb.append(";"+getValue(list.get(j),key));
                    }
                    sb.deleteCharAt(0);
                    result.put(key, sb.toString());
                }
            }
        }
        System.out.println("map合并以后:n" + result);
    }

    private static int getValue(HashMap<String,Integer> map,String key){
        Integer result = map.get(key);
        return result==null?-1:result;
    }

    //随机构造n个hashmap
    public static List<HashMap<String,Integer>> generate(){
        List<HashMap<String,Integer>> list = new ArrayList<>();
        Random r = new Random();
        int i=(int) (Math.round(Math.random()*3 + 3));//hashMap的数量
        System.out.println("输入hashMap的数量:   "+i);

        int tmpSize = 0;
        HashMap tmpmap = null;
        for (int j = 0; j < i; j++) {
            tmpmap = new HashMap<String,Integer>();
            //hashMap的长度
            tmpSize = (int) (Math.round(Math.random()*10 + 4));
            for (int k = 0; k < tmpSize; k++) {
                //随机键值对
                String key = String.valueOf((char)(int) (Math.round(Math.random()*25 + 97)));
                int value = (int) (Math.round(Math.random()*8 + 1));
                tmpmap.put(key, value);
            }
            list.add(tmpmap);
            System.out.println(tmpmap);
        }
        return list;
    }
}

解决方案二:

public class CSDNTest
{
public static void main(String[] args)
{
Map m1 = createMap(3);
Map m2 = createMap(5);
Map m3 = createMap(7);

    Set<String> keySet = new HashSet<String>();

    keySet.addAll(m1.keySet());
    keySet.addAll(m2.keySet());
    keySet.addAll(m3.keySet());

    Map<String, String[]> data = new HashMap<String, String[]>();

    for(String key : keySet)
    {
        String[] array = data.get(key);

        if(null == array)
        {
            array = new String[3];
            data.put(key, array);
        }

        array[0] = m1.get(key);
        array[1] = m2.get(key);
        array[2] = m3.get(key);

        for(int i=0;i<array.length;i++)
        {
            if(null == array[i])
            {
                array[i] = "-1";
            }
        }
    }

    for(String s : data.keySet())
    {
        System.out.println("key:"+s+"  value:"+Arrays.toString(data.get(s)));
    }
}

public static Map<String, String> createMap(int length)
{
    String key = "key";
    String value = "value";
    Map<String, String> map = new HashMap<String, String>();
    for(int j=1;j<=length;j++)
    {
        map.put(key + j, value + j);
    }

    return map;
}

}

输出:
key:key4 value:[-1, value4, value4]
key:key3 value:[value3, value3, value3]
key:key6 value:[-1, -1, value6]
key:key5 value:[-1, value5, value5]
key:key2 value:[value2, value2, value2]
key:key1 value:[value1, value1, value1]
key:key7 value:[-1, -1, value7]

解决方案三:

用谷歌 Guava 中的Multimap 。
http://ifeve.com/google-guava-newcollectiontypes/

时间: 2024-10-03 21:04:55

java求几个hashmap中key的并集,输出value的相关文章

java集合框架12——HashMap和HashTable的区别

版权声明:尊重博主原创文章,转载请注明出处哦~http://blog.csdn.net/eson_15/article/details/51250324 目录(?)[+] 前面已经学习了Map的部分内容,主要是HashMap和HashTable,这一节我们来看看它们两有啥异同点. 1. HashMap和HashTable的相同点         HashMap和HashTable都是存储"键值对"的散列表,而且都是采用拉链法来实现的.存储的思想都是:通过table数组存储,数组的每个元

java-JAVA求101到200的素数并全部输出 求大神看下我的编程错在哪谢谢

问题描述 JAVA求101到200的素数并全部输出 求大神看下我的编程错在哪谢谢 public class SuShu { public static void main(String[] args) { int i = 0; for(int a=101;a<200;a+=2) { for(int b=2;b<a;b++) { if(a%b!=0) { System.out.println(a); i = i + 1; } else { break; } } } System.out.prin

Java用自定义的类作为HashMap的key值实例_java

这是Java中很经典的问题,在面试中也经常被问起.其实很多书或者文章都提到过要重载hashCode()和equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果,好像很少有文章讲到,所以写这么一篇来说明下. 首先,如果我们直接用以下的Person类作为键,存入HashMap中,会发生发生什么情况呢? public class Person { private String id; public Person(String id) { thi

对java中递归问题的输出不理解,求大神解答!谢谢

问题描述 对java中递归问题的输出不理解,求大神解答!谢谢 对于这一段代码我能够理解,压栈然后出栈就是6,5,4 package recursion; public class testRecursion { public static void main(String[] args) { int num=3; recursion(num); } private static void recursion(int n){ n++; if(n<7){ recursion(n); System.o

java 7-画的图一直显示不到中间,求问关于JFrame中添加Graphics时该如何设置及相关内容

问题描述 画的图一直显示不到中间,求问关于JFrame中添加Graphics时该如何设置及相关内容 import java.awt.*; import javax.swing.*; public class Fractal extends JFrame{ private PaintTriangle paintTriangle = new PaintTriangle(); public Fractal(){ paintFractal(1); add(paintTriangle); } privat

java代码-求上传文件中nosuchmethoderror(androidsdk与httpclientjar冲突)解决办法

问题描述 求上传文件中nosuchmethoderror(androidsdk与httpclientjar冲突)解决办法 android项目使用阿里云上传文件的Sample文件代码,出现了nosuchmethoderror,然后我顺着日志查到android sdk中在org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager这个类里只有一个构造方法,而代码依赖的httpclient是4.1.3版本,相同的类里有4个构造方法,我认为问题可

java语言:修改session中的hashMap值,为什么不需要更新session

问题描述 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{HttpSessionsession=request.getSession(false);RequestDispatcherdispatcher;//如果session不存在,转向/ch04/books.jspif(session==null){dispatcher=reque

编程-java 计算输入英文句子中出现过的字母的次数

问题描述 java 计算输入英文句子中出现过的字母的次数 不区分大小写,大写字母一律先变换成小写字母再计算 例 输入 This is a pen. 输出 a : 1 b : 0 c : 0 d : 0 e : 1 f : 0 g : 0 h : 1 i : 2 j : 0 k : 0 l : 0 m : 0 n : 1 o : 0 p : 1 q : 0 r : 0 s : 2 t : 1 u : 0 v : 0 w : 0 x : 0 y : 0 z : 0 使用一下代码雏形 import j

java集合框架之hashmap

定义     hashmap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同.)此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同.根据对冲突的处理方式不同,哈希表有两种实现方式,一种开放地址方式(Open addressing),另