java的List集合里面放了Map,List<Map<String,Object>>,如何判定人名相同,就组合成一个对象?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的List集合里面放了Map,List<Map<String,Object>>,如何判定人名相同,就组合成一个对象?相关的知识,希望对你有一定的参考价值。
之前的数据样例:
[
"name": "张三",
"公司": "腾讯"
,
"name": "李四",
"公司": "阿里"
,
"name": "王五",
"公司": "百度"
,
"name": "张三",
"地址": "四川"
,
"name": "李四",
"地址": "湖南"
,
"name": "王五",
"地址": "广东"
]
我需要的数据:
[
"name": "张三",
"公司": "腾讯",
"地址": "四川"
,
"name": "李四",
"公司": "阿里",
"地址": "湖南"
,
"name": "王五",
"公司": "百度",
"地址": "广东"
]
受楼上两位老哥启发,代码如下
public class Test2
public static void main(String[] args)
Map<String, String> map1 = new MyMap<>();
map1.put("name", "张三");
map1.put("公司", "腾讯");
Map<String, String> map2 = new MyMap<>();
map2.put("name", "李四");
map2.put("公司", "阿里");
Map<String, String> map3 = new MyMap<>();
map3.put("name", "王五");
map3.put("公司", "百度");
Map<String, String> map4 = new MyMap<>();
map4.put("name", "哈哈哈");
map4.put("公司", "嘿嘿嘿");
Map<String, String> map5 = new MyMap<>();
map5.put("name", "张三");
map5.put("地址", "四川");
Map<String, String> map6 = new MyMap<>();
map6.put("name", "李四");
map6.put("地址", "湖南");
Map<String, String> map7 = new MyMap<>();
map7.put("name", "王五");
map7.put("地址", "广东");
List<Map<String, String>> list = new ArrayList<>();
list.add(map1);
list.add(map2);
list.add(map3);
list.add(map4);
list.add(map5);
list.add(map6);
list.add(map7);
//lambda遍历输出
list.forEach(map -> System.out.println(map.toString()));
System.out.println("==========================");
Map<String, String> m1;
Map<String, String> m2;
/* 遍历方式:
* 将集合中当前元素m1与它后一个元素m2比较,若name相同,则将m2中的内容put到m1中,同时删除m2
* 指针j向右偏移一位,重复上一步,直至所有元素都作为m1过一次
* */
for (int i = 0; i < list.size() - 1; i++)
for (int j = i; j < list.size() - 1; j++)
m1 = list.get(i);
m2 = list.get(j + 1);
//若m1与m2的name相同
if (m1.equals(m2))
//则将m2中的内容put到m1中
m2.forEach(m1::put);//lambda遍历
//删除m2
list.remove(j + 1);
System.out.println("==========================");
//lambda遍历输出
list.forEach(map -> System.out.println(map.toString()));
@SuppressWarnings("unchecked")
static class MyMap<K, V> extends LinkedHashMap<K, V>
/**
* 重写equals方法,this为m1,o为m2
* 这里其实需要instanceof来检查泛型的,但是我不会使用instanceof来检查泛型,
* 不能直接使用if ( o instanceof LinkedHashMap<String, String>),这样是
* 编译失败的,所以我没办法只能用try弄一下
*
* @param o m2
* @return 若m1与m2的name相同,返回true
*/
@Override
public final boolean equals(Object o)
if (o == this)
return true;
try
LinkedHashMap<String, String> map = (LinkedHashMap<String, String>) o;
if (this.get("name").equals(map.get("name")))
return true;
catch (ClassCastException e)
e.printStackTrace();
return false;
我怕代码挤在一起,截图给你:
运行结果:
List<Map<String,Object>> mapList = new ArrayList<>();
Map<Object,Map<String,Object>> resultMap = new HashMap();
for (Map<String, Object> map : mapList)
Object name = map.get("name");
if (resultMap.get(name)==null)
resultMap.put(name,map);
resultMap.get(name).putAll(map);
resultMap 是个map里面套map的,之所以不用list套map是为了循环里面get操作复杂度为O(1)。你最后想要list格式的话,
List ls = new ArrayList(resultMap.values() 或者 entrySet()); 调用一下这个就好了呗。这没什么影响。
写代码思维很重要,你要看的懂,别人要看得懂,要简洁,要性能。或许还有别的方法实现,可以钻研一下。
java list集合问题
list 里面装了2个list。
a 集合里面有 b和c 2个集合
b集合里有1和2 c集合有 3和4
如何把1,2,3,4 装到一个集合里面
求大牛帮忙啊
区别就是add添加的是什么就是什么,addALL会把添加的List的值先取出来然后在add到list中
以上回答你满意么? 参考技术A List<List<String>> a = new ArrayList<List<String>>();
List<String> result = new ArrayList<String>();
for (int k=0;k<a.size();k++)
if(a.get(k) != null)
for (int m=0; m<a.get(k).size();m++)
result.add(a.get(k).get(m).toString);
result 这个集合中就存储的是你需要的,如果你问的是这个意思,那么希望采纳。 参考技术B public class Test
public static void main(String[] args)
List<String> list = new ArrayList<String>();
List<Object> listA = new ArrayList<Object>();
List<String> listB = new ArrayList<String>();
List<String> listC = new ArrayList<String>();
listB.add("1");
listB.add("2");
listC.add("3");
listC.add("4");
listA.add(listB);
listA.add(listC);
//System.out.println(listA);
for(String temp : listB)
list.add(temp);
for(String temp : listC)
list.add(temp);
System.out.println( "aa " + list);
我是菜鸟,我这样写一下,你看看和你的要求符合不?
以上是关于java的List集合里面放了Map,List<Map<String,Object>>,如何判定人名相同,就组合成一个对象?的主要内容,如果未能解决你的问题,请参考以下文章