【问题标题】:Update object in list based on object id根据对象 id 更新列表中的对象
【发布时间】:2021-10-20 13:18:53
【问题描述】:

我想知道是否可以通过 id 直接更新 List 中的对象。 这是我的对象结构:

public class MyObject {
    public UUID uuid;
    public String string1;
    public int int1;
    ...
}

在另一个对象中,我有一个 MyObject 列表,我想通过对象 ID 更新其中一个。 除了以下代码,还有其他解决方案吗?

List<MyObject> list = new ArrayList<>();
// Add many object into my list
MyObject newObject = new MyObject(...);

list.removeIf(o -> o.getUuid().equals(newObject.getUuid()));
list.add(newObject);

【问题讨论】:

  • 您必须移除对象并完全替换它吗?是你想要的吗?还是您只想更新对象的一个​​字段?我的意思是,如果您有办法获取要更新的对象的索引,或者直接获取对象,为什么不直接更新对象中的字段呢? (除非它们是最终的或其他)
  • 如果你想有其他替代方法,答案是很多方法。例如,您可以按索引查找。
  • 是的,我想替换整个对象
  • 好吧,那么 tbh,如果你想替换整个项目,我看不出有什么更好的......除非你愿意切换到另一个数据结构:那么也许你可以使用HashMap,因为您已经使用唯一 id 作为键,您可以选择:HashMap 并使用 put() 或 replace(),具体取决于您想要的内容 编辑:我可以回答, 如果这是你想要的

标签: java list arraylist


【解决方案1】:

紧凑,但老套...

List<MyObject> list2 =
list.stream().map(item->item.getUuid().equals(newObject.getUuid()) ? newObject : item)
.collect(Collectors.toList();

【讨论】:

    【解决方案2】:

    如果您真的想坚持使用List,您可以遍历列表并每次手动检查 UUID。

    List<MyObject> list = new ArrayList<>();
    for (int i = 0; i < list.size(), i++) {
        if (list.get(i).getUuid().equals(newObject.getUuid())) {
            list.set(i, newObject());
            // Probably want to stop the loop here.
        }
    }
    

    UUID 用作Map 的键使其更简单。

    List<MyObject> list = new ArrayList<>();
    Map<UUID, MyObject> map = list.stream().collect(Collecotrs.toMap(o -> o.getUuid(), o -> o));
    map.put(newObject.getUuid(), newObject);
    list = new ArrayList<>(map.values());
    

    【讨论】:

    • 这里唯一要检查的是是否需要 put() 或 replace(),因为如果对象不存在,put() 会添加该对象,但这是由 OP 决定的。很好的答案,比我的评论写得更好!
    【解决方案3】:

    我认为最简单的方法是实现 hashcode/equals,使其以 UUID 为目标。调用 add() 和 remove() 时,将在列表中添加和删除与 UUID 匹配的对象。

    这是一个例子:

    import java.util.*;
    
    public class ListExample {
        public static void main(String[] args) {
            System.out.println("Implementation using a LinkedList.");
            List<MyObject> list = new ArrayList<>();
            list.add(new MyObject(UUID.fromString("299971c6-31b8-11ec-8d3d-0242ac130003"), "A", 0));
            list.add(new MyObject(UUID.fromString("31e77904-31b8-11ec-8d3d-0242ac130003"), "B", 1));
            list.add(new MyObject(UUID.fromString("368b0214-31b8-11ec-8d3d-0242ac130003"), "C", 2));
            System.out.println(list);
            System.out.println("Remove an entry.");
            list.remove(new MyObject(UUID.fromString("368b0214-31b8-11ec-8d3d-0242ac130003")));
            System.out.println(list);
            list.add(new MyObject(UUID.fromString("9b21edea-31b9-11ec-8d3d-0242ac130003"), "D", 3));
            System.out.println(list);
            System.out.println("Adding a duplicate (creates a new entry).");
            list.add(new MyObject(UUID.fromString("299971c6-31b8-11ec-8d3d-0242ac130003"), "A", 0));
            System.out.println(list);
            System.out.println("Remove duplicate (removes the first entry but not the last).");
            list.remove(new MyObject(UUID.fromString("299971c6-31b8-11ec-8d3d-0242ac130003"), "A", 0));
            System.out.println(list);
        }
    
        public static class MyObject {
            public UUID uuid;
            public String string1;
            public int int1;
    
            public MyObject(UUID uuid) {
                this.uuid = uuid;
            }
    
            public MyObject(UUID uuid, String string1, int int1) {
                this.uuid = uuid;
                this.string1 = string1;
                this.int1 = int1;
            }
    
            @Override
            public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                MyObject myObject = (MyObject) o;
                return Objects.equals(uuid, myObject.uuid);
            }
    
            @Override
            public int hashCode() {
                return Objects.hash(uuid);
            }
    
            @Override
            public String toString() {
                return "MyObject{" +
                    "uuid=" + uuid +
                    ", string1='" + string1 + '\'' +
                    ", int1=" + int1 +
                    '}';
            }
        }
    
    }
    

    输出:

    Implementation using a LinkedList.
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=368b0214-31b8-11ec-8d3d-0242ac130003, string1='C', int1=2}]
    Remove an entry.
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}]
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=9b21edea-31b9-11ec-8d3d-0242ac130003, string1='D', int1=3}]
    Adding a duplicate (creates a new entry).
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=9b21edea-31b9-11ec-8d3d-0242ac130003, string1='D', int1=3}, MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}]
    Remove duplicate (removes the first entry but not the last).
    [MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=9b21edea-31b9-11ec-8d3d-0242ac130003, string1='D', int1=3}, MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}]
    

    这里的主要问题是可以创建重复项(因为我们使用列表)

    如果您需要一种保留顺序并排除重复项的方法,请使用 LinkedHashSet

    import java.util.*;
    
    public class SetExample {
        public static void main(String[] args) {
            System.out.println("Implementation using a LinkedHashSet");
            Set<MyObject> set = new LinkedHashSet<>();
            set.add(new MyObject(UUID.fromString("299971c6-31b8-11ec-8d3d-0242ac130003"), "A", 0));
            set.add(new MyObject(UUID.fromString("31e77904-31b8-11ec-8d3d-0242ac130003"), "B", 1));
            set.add(new MyObject(UUID.fromString("368b0214-31b8-11ec-8d3d-0242ac130003"), "C", 2));
            System.out.println(set);
            System.out.println("Remove an entry.");
            set.remove(new MyObject(UUID.fromString("368b0214-31b8-11ec-8d3d-0242ac130003")));
            System.out.println(set);
            set.add(new MyObject(UUID.fromString("9b21edea-31b9-11ec-8d3d-0242ac130003"), "D", 3));
            System.out.println(set);
            System.out.println("Adding a duplicate (does not create a new entry).");
            set.add(new MyObject(UUID.fromString("299971c6-31b8-11ec-8d3d-0242ac130003"), "A", 0));
            System.out.println(set);
        }
    
        public static class MyObject {
            public UUID uuid;
            public String string1;
            public int int1;
    
            public MyObject(UUID uuid) {
                this.uuid = uuid;
            }
    
            public MyObject(UUID uuid, String string1, int int1) {
                this.uuid = uuid;
                this.string1 = string1;
                this.int1 = int1;
            }
    
            @Override
            public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                MyObject myObject = (MyObject) o;
                return Objects.equals(uuid, myObject.uuid);
            }
    
            @Override
            public int hashCode() {
                return Objects.hash(uuid);
            }
    
            @Override
            public String toString() {
                return "MyObject{" +
                    "uuid=" + uuid +
                    ", string1='" + string1 + '\'' +
                    ", int1=" + int1 +
                    '}';
            }
        }
    

    输出:

    Implementation using a LinkedHashSet
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=368b0214-31b8-11ec-8d3d-0242ac130003, string1='C', int1=2}]
    Remove an entry.
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}]
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=9b21edea-31b9-11ec-8d3d-0242ac130003, string1='D', int1=3}]
    Adding a duplicate (does not create a new entry).
    [MyObject{uuid=299971c6-31b8-11ec-8d3d-0242ac130003, string1='A', int1=0}, MyObject{uuid=31e77904-31b8-11ec-8d3d-0242ac130003, string1='B', int1=1}, MyObject{uuid=9b21edea-31b9-11ec-8d3d-0242ac130003, string1='D', int1=3}]
    

    【讨论】:

      【解决方案4】:

      使用这样的东西:

          List<MyObject> list = new ArrayList<MyObject>();
          
          int id = 4; //the UUID of the Object you are searching for
          
          MyObject found = list.stream()
                  .filter(MyObject -> (MyObject.getUUID()==id))
                  .findAny()
                  .orElse(null);
          
          int i = list.indexOf(found);
          int newUUID = 3;
          list.get(i).setUUID(newUUID);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2019-01-11
        • 1970-01-01
        • 2020-11-01
        相关资源
        最近更新 更多