从另一个列表

时间:2016-07-15 03:22:53

标签: 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,""));

另一个用户列表包含

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

现在我如何合并这两个List并使用 id 获取一个User列表,考虑性能。考虑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,""));

2 个答案:

答案 0 :(得分:0)

对于小型列表而言,这是非常简单的,不考虑性能问题并假设合并策略附加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;
}

答案 1 :(得分:0)

您可以将HashMap用作辅助数据结构
对于密钥需要使用用户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。