Java 从另一个列表更新列表中的对象

Java 从另一个列表更新列表中的对象,java,list,object,arraylist,merge,Java,List,Object,Arraylist,Merge,我有一个用户列表 List<User> usrList1 = new ArrayList<User>(); userList.add(new User("usr1",11,"")); userList.add(new User("usr2",22,"")); userList.add(new User("usr3",33,"")); 这对于一个小列表来说非常简单,没有考虑性能问题,也没有假设附加名称和数据字段的合并策略: 将浅列表1复制到合并的新列表中 遍历列表2 对于

我有一个用户列表

List<User> usrList1 = new ArrayList<User>();
userList.add(new User("usr1",11,""));
userList.add(new User("usr2",22,""));
userList.add(new User("usr3",33,""));

这对于一个小列表来说非常简单,没有考虑性能问题,也没有假设附加名称和数据字段的合并策略:

将浅列表1复制到合并的新列表中 遍历列表2 对于合并中的每个项目,请检查列表2中的项目是否已存在 如果该项存在,只需更新其字段即可 如果不存在,请将其附加到合并的 代码:


这对于一个小列表来说非常简单,没有考虑性能问题,也没有假设附加名称和数据字段的合并策略:

将浅列表1复制到合并的新列表中 遍历列表2 对于合并中的每个项目,请检查列表2中的项目是否已存在 如果该项存在,只需更新其字段即可 如果不存在,请将其附加到合并的 代码:


您可以使用HashMap作为辅助数据结构 For键需要使用列表中的用户id整数值

public static void main(String[] args) {
    List<User> userList1 = new ArrayList<User>();
    userList1.add(new User("usr1", 11, ""));
    userList1.add(new User("usr2", 22, ""));
    userList1.add(new User("usr3", 33, ""));

    List<User> userList2 = new ArrayList<User>();
    userList2.add(new User("", 11, "add1"));
    userList2.add(new User("", 22, "add2"));

    // Insert all elements from first list to hash map
    HashMap<Integer, User> userMap = new HashMap<>();
    for (User user : userList1) {
        userMap.put(user.getId(), user);
    }

    // Update user elements
    for (User user : userList2) {
        User update = userMap.get(user.getId());
        update.setAddres(user.getAddress());
    }

    // convert hash map to list
    List<User> merge = new ArrayList<>();
    merge.addAll(userMap.values());

    System.out.println(merge);
}
注:
HashMap不会保留元素的顺序。如果需要合并列表的顺序与userList1相同,则使用LinkedHashMap

您可以使用HashMap作为辅助数据结构 For键需要使用列表中的用户id整数值

public static void main(String[] args) {
    List<User> userList1 = new ArrayList<User>();
    userList1.add(new User("usr1", 11, ""));
    userList1.add(new User("usr2", 22, ""));
    userList1.add(new User("usr3", 33, ""));

    List<User> userList2 = new ArrayList<User>();
    userList2.add(new User("", 11, "add1"));
    userList2.add(new User("", 22, "add2"));

    // Insert all elements from first list to hash map
    HashMap<Integer, User> userMap = new HashMap<>();
    for (User user : userList1) {
        userMap.put(user.getId(), user);
    }

    // Update user elements
    for (User user : userList2) {
        User update = userMap.get(user.getId());
        update.setAddres(user.getAddress());
    }

    // convert hash map to list
    List<User> merge = new ArrayList<>();
    merge.addAll(userMap.values());

    System.out.println(merge);
}
注:
HashMap不会保留元素的顺序。如果需要合并列表的顺序与userList1相同,则使用LinkedHashMap

add3在最终列表中来自哪里?我的错。更新了。对于50个项目的列表来说,性能是不成问题的。为什么不尝试使用Map呢?您可以轻松地使用usrList2的元素更新每个usrList1,只需输入新的值。@usrList1中的Molinetas对象几乎没有像name这样的值,usrList2几乎没有像address这样的其他值。只有id在它们之间很常见。我不知道如何在这个场景中使用map。add3在最终列表中来自哪里?我的错。更新了。对于50个项目的列表来说,性能是不成问题的。为什么不尝试使用Map呢?您可以轻松地使用usrList2的元素更新每个usrList1,只需输入新的值。@usrList1中的Molinetas对象几乎没有像name这样的值,usrList2几乎没有像address这样的其他值。只有id在它们之间很常见。我不知道如何在这个场景中使用map。我试图避免多个集合对象和多个for循环。无论如何,谢谢你的回答。我试图避免多个收集对象和多个for循环。无论如何,谢谢你的回答。
public static List<User> Merge(List<User> list1, List<User> list2) {
    List<User> merged = new ArrayList<User>(list1);
    for (User user : list2) {
        boolean found = false;
        for (User u : merged) {
            if (u.Id == user.Id) {
                found = true;
                u.Name += user.Name;
                u.Data += user.Data;
                break;
            }
        }
        if (!found) {
            merged.add(user);
        }
    }
    return merged;
}
public static void main(String[] args) {
    List<User> userList1 = new ArrayList<User>();
    userList1.add(new User("usr1", 11, ""));
    userList1.add(new User("usr2", 22, ""));
    userList1.add(new User("usr3", 33, ""));

    List<User> userList2 = new ArrayList<User>();
    userList2.add(new User("", 11, "add1"));
    userList2.add(new User("", 22, "add2"));

    // Insert all elements from first list to hash map
    HashMap<Integer, User> userMap = new HashMap<>();
    for (User user : userList1) {
        userMap.put(user.getId(), user);
    }

    // Update user elements
    for (User user : userList2) {
        User update = userMap.get(user.getId());
        update.setAddres(user.getAddress());
    }

    // convert hash map to list
    List<User> merge = new ArrayList<>();
    merge.addAll(userMap.values());

    System.out.println(merge);
}