关于一个处理集合的问题,请各位专家帮我看看!

关于一个处理集合的问题,请各位专家帮我看看,最终效果:以第一个集合为准,如果其他集合的id和name对的上第一个集合话;最后合并成这样,都是map形式的,不是用实体接受的

img

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
假设有以下几个集合:

set1 = [{"id": 1, "name": "Tom"}, {"id": 2, "name": "Jack"}, {"id": 3, "name": "Mary"}]

set2 = [{"id": 1, "name": "Tom", "age": 18}, {"id": 2, "name": "Jack", "age": 20}, {"id": 4, "name": "Rose", "age": 22}]

set3 = [{"id": 1, "name": "Tom", "gender": "Male"}, {"id": 3, "name": "Mary", "gender": "Female"}, {"id": 5, "name": "John", "gender": "Male"}]

可以先取出第一个集合(set1)中的id和name,然后遍历其他集合,判断其中是否存在相同id和name的元素,如果存在则将其合并到同一个map中。可以使用以下代码实现:

set1_id_name = {item["id"]: item["name"] for item in set1}
result_map = {}

for s in [set2, set3]:
    for item in s:
        if item["id"] in set1_id_name and item["name"] == set1_id_name[item["id"]]:
            if item["id"] not in result_map:
                result_map[item["id"]] = {"id": item["id"], "name": item["name"]}
            result_map[item["id"]].update(item)
            
print(list(result_map.values()))

上述代码中,先将第一个集合(set1)中的id和name取出,保存为一个字典(set1_id_name),便于后续判断。然后遍历其他集合(set2、set3),判断其中是否存在相同id和name的元素,如果存在,将其合并到最终结果(result_map)中。最后将结果字典中的值转化为列表即可。

运行结果为:

[{'id': 1, 'name': 'Tom', 'age': 18, 'gender': 'Male'},
 {'id': 2, 'name': 'Jack', 'age': 20},
 {'id': 3, 'name': 'Mary', 'gender': 'Female'}]

其中,set2和set3中id为4和5的元素没有被合并到最终结果中,因为它们的id和name与第一个集合(set1)中的不匹配。
如果我的回答解决了您的问题,请采纳!



import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class Main {
    public static void main(String[] args) {

        List<Map<String, String>> list1 = new ArrayList<>();
        Map<String, String> map1 = new HashMap<>();
        Map<String, String> map2 = new HashMap<>();
        Map<String, String> map3 = new HashMap<>();
        Map<String, String> map4 = new HashMap<>();
        map1.put("id", "1");
        map1.put("name", "张三");
        map1.put("数学", "40");
        map2.put("id", "2");
        map2.put("name", "李四");
        map2.put("数学", "50");

        map3.put("id", "3");
        map3.put("name", "王五");
        map3.put("英语", "70");

        map4.put("id", "2");
        map4.put("name", "李四");
        map4.put("语文", "80");

        list1.add(map1);
        list1.add(map2);
        list1.add(map3);
        list1.add(map4);

        Map<String, Map<String, String>> resultMap = new HashMap<>();
        for (Map<String, String> map : list1) {
            String id = map.get("id");
            String name = map.get("name");
            String key = id + name;
            if (resultMap.containsKey(key)) {
                Map<String, String> temp = resultMap.get(key);
                temp.putAll(map);
            } else {
                Map<String, String> tempMap = new HashMap<>(map);
                resultMap.put(key, tempMap);
            }
        }
        List<Map<String, String>> resultList = new ArrayList<>();
        resultList.addAll(resultMap.values());
        System.out.println(JSONObject.toJSONString(resultList));
    }

}

json转map 然后迭代map 根据 name进行待选然后加入对应的新map

给你建议,先把所有的数据进行遍历一遍,然后定义map,以name作为key名,不同名则新增map,把相同的key的添加到一个集合中,依次把不同科目的数据规整到一个map中;

参考GPT和自己的思路:

首先需要理解问题意思,给定两个集合,按照第一个集合中的id和name属性,将两个集合中对应的对象属性合并为一个新的集合,且包含第一个集合中没有的对象。可以使用Java8中的Stream API来处理该问题,具体代码如下:

List<Item> result = list1.stream()
    .map(item1 -> list2.stream()
        .filter(item2 -> item2.getId().equals(item1.getId()) && item2.getName().equals(item1.getName()))
        .findFirst()
        .orElse(item1))
    .collect(Collectors.toList());
list2.stream()
    .filter(item2 -> list1.stream()
        .noneMatch(item1 -> item2.getId().equals(item1.getId()) && item2.getName().equals(item1.getName())))
    .forEach(result::add);

其中,Item是代表集合中对象的类,list1和list2是代表两个集合的List,result是合并后的新集合。第一段代码使用map和findFirst方法,遍历第一个集合中的对象,并在第二个集合中查找id和name均相同的对象,如果找到则合并属性,否则保留第一个集合中的对象。第二段代码使用filter方法和noneMatch方法,遍历第二个集合中的对象,查找在第一个集合中没有出现的对象,并添加到结果集中。

希望这个回答能对您有所帮助!

找了一篇类似的文章,可以参考下
https://www.likecs.com/show-308360342.html