【问题标题】:Update objects in a list from another List从另一个列表更新列表中的对象
【发布时间】:2016-11-18 03:34:06
【问题描述】:

我有一个用户列表

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

另一个用户列表包含

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

考虑到性能,现在我如何合并这两个列表并使用 id 获得一个用户列表。考虑userList1userList2 的大小约为50。

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

【问题讨论】:

  • 最终列表中的“add3”从何而来?
  • 对不起。已更新。
  • 性能在这里真的没有问题,对于 50 个项目的列表。
  • 为什么不尝试使用地图?您可以使用 usrList2 的元素轻松更新每个 usrList1,只需输入新值即可。
  • usrList1 中的 @Molinetas 对象的值很少(例如名称),而 usrList2 的其他值很少(例如地址),只有 id 是常见的。我没有告诉你如何在这种情况下使用地图。

标签: java list object arraylist merge


【解决方案1】:

这对于一个小列表来说非常简单,无需考虑性能问题并假设合并策略是添加 NameData 字段:

  • 复制(浅)list1 到一个新列表merged
  • 迭代list2
    • 对于merged 中的每个项目,检查list2 中的项目是否已存在
    • 如果项目存在,只需更新其字段
    • 如果不存在,追加到merged的末尾

代码:

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

【讨论】:

    【解决方案2】:

    您可以使用 HashMap 作为辅助数据结构
    需要key才能使用用户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 不会保留元素的顺序。如果需要merge 列表与userList1 的顺序相同,则使用LinkedHashMap。

    【讨论】:

    • 我试图避免多个集合对象和多个 for 循环。不管怎样,谢谢你的回答。
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多