我想知道是否可以通過其 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);
uj5u.com熱心網友回復:
如果您真的想堅持使用List.
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());
uj5u.com熱心網友回復:
緊湊,但hacky...
List<MyObject> list2 =
list.stream().map(item->item.getUuid().equals(newObject.getUuid()) ? newObject : item)
.collect(Collectors.toList();
uj5u.com熱心網友回復:
我認為最簡單的方法是以這樣一種方式實作哈希碼/等于,它會以 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}]
uj5u.com熱心網友回復:
使用這樣的東西:
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328990.html
上一篇:您將如何遍歷索引鍵以整數形式給出但已預定義的庫(如果有道理)
下一篇:從串列向串列中的字典添加新鍵、值
