java的List集合里面放了Map,List<Map<String,Object>>,如何判定人名相同,就组合成一个对象? 5

之前的数据样例:[{"name":"张三","公司":"腾讯"},{"name":"李四","公司":"阿里"},{"name":"王五","公司":"百度"},{"na... 之前的数据样例:
[
{
"name": "张三",
"公司": "腾讯"
},
{
"name": "李四",
"公司": "阿里"
},
{
"name": "王五",
"公司": "百度"
},
{
"name": "张三",
"地址": "四川"
},
{
"name": "李四",
"地址": "湖南"
},
{
"name": "王五",
"地址": "广东"
}
]

我需要的数据:
[
{
"name": "张三",
"公司": "腾讯",
"地址": "四川"
},
{
"name": "李四",
"公司": "阿里",
"地址": "湖南"
},
{
"name": "王五",
"公司": "百度",
"地址": "广东"
}
]
展开
 我来答
澈丶233
2019-10-21 · TA获得超过169个赞
知道小有建树答主
回答量:446
采纳率:94%
帮助的人:106万
展开全部

受楼上两位老哥启发,代码如下


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;
}
}
}


我怕代码挤在一起,截图给你:

定义myMap,放入数据

map入集合,遍历打印

执行比较,最后再输出一次集合

定义内部类MyMap,重写equals方法


运行结果:

side香水
2019-10-21 · 超过34用户采纳过TA的回答
知道答主
回答量:244
采纳率:66%
帮助的人:18.1万
展开全部
我也忘了,好像是重写类的equles方法,还是写个比较器,一直有点分不清。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-10-21
展开全部
重写类的equals和hashcode方法,就可以实现了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
陌糖糖糖嫣红
2020-01-02 · TA获得超过167个赞
知道小有建树答主
回答量:295
采纳率:80%
帮助的人:40.2万
展开全部

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()); 调用一下这个就好了呗。这没什么影响。

写代码思维很重要,你要看的懂,别人要看得懂,要简洁,要性能。或许还有别的方法实现,可以钻研一下。


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式