7
回答
java两个集合合并最优方法?
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

现在有两个集合,数据类型都为

List<Map<String,String>> 

其中第一个集合map是{id:1,key:2}

另外一个集合是{id:1,name:xx}

要合并这2个list集合变成{name:xx,key:2},id是一样的,最后生成的集合类型也是

List<Map<String,String>> 

除了双重循环通过id比较之外,有没有更好更优的方案?

举报
CoderLeon
发帖于3年前 7回/8K+阅
共有7个答案 最后回答: 3年前
public void test(){
		List<Map<String, String>> list1 = new LinkedList<Map<String, String>>();
		List<Map<String, String>> list2 = new LinkedList<Map<String, String>>();
		Map<String,Integer> idsMap = new HashMap<String,Integer>();
		for (int i = 0; i < list1.size(); i++) {
			String id = list1.get(i).get("id");
			idsMap.put(id,i);
		}
		
		for (Map<String, String> map : list2) {
			String id = map.get("id");
			Integer index = idsMap.get(id);
			if(index != null){
				Map<String, String> tMap = list1.get(index);
				map.putAll(tMap);
			}
		}
	}

上述思路可以满足一般应用场景。


LZ,这个问题很经典,很麻烦,LS基本就是正确答案了。

数据库可以计算并集,看看数据库怎么实现就清楚了。在没有索引的情况下,就是循环,有索引就用索引。这就是为啥一般推荐用union all而不是union。换成java道理是一样的,在一个集合上建索引,然后再用另一个集合来匹配这个索引,当然这个索引用hash还是树那就看数据集大小了。

貌似也可以在两者上都建索引,然后用索引合并的思路,不过这个比较抽象就算了吧。

引用来自“Frank_mc”的评论

如果量大追求速度快,根据id构造hashmap,然后合并

不知道楼主的 Map 的 KEY —VALUE 是怎么划分,感觉更像是Value是一个JSON。

话说思路就是基本就是遍历一遍 

for i in map1

list.add(new map(map1.get(i)), map2.get(i))

当然list里面是JSON,就能达到楼主的数据结构了。

首先空间浪费太大了。就算Map只存一组数据,容量也是16(默认16,之后按2的倍数递增)。这种数据应该是一个Pojo类。

所以应该是List<TypeA> listA ;List<TypeB> listB;

增强for循环,返回List<TypeC>。

Map是空间换时间的一种数据结构。需要酌情使用。



public void test(){
        List<Map<String, String>> list1 ;

        List<Map<String, String>> list2 ;

        List<Map<String, String>> resultList = new ArrayList<String, String>();

        

       Object[] keys;

       HashMap map;

        HashMap map2;

        for(inti =0; i < list1.size(); i++) {

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

            map = list1.get(i);

            map2 = list2.get(i);

            keys = map.keySet().toArray();

            String key1 = (String)keys[0];

            String val1 =  map2.get(key1);

            resultMap .put(key1 ,val1 );

            resultList.add(resultMap);

        }

    }

--- 共有 1 条评论 ---
CoderLeon跑了下你的代码,结果明显是不对的 3年前 回复
顶部