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