我遇到了以下情況,並且想知道最佳解決方案。假設我有List<Object1>
和List<Object2>
,這些列表是兩個分離查詢的結果。它們都具有相同的大小,並且基於ID的列表中的元素之間存在1:1的關係。我知道最好的解決方案是在一個數據庫查詢中獲取數據,但現在可能就是這樣。將兩個列表中的數據合併到一個對象中
所以我的問題是,什麼是最好的方式加入這些名單,讓我們說List<Object3>
?
我遇到了以下情況,並且想知道最佳解決方案。假設我有List<Object1>
和List<Object2>
,這些列表是兩個分離查詢的結果。它們都具有相同的大小,並且基於ID的列表中的元素之間存在1:1的關係。我知道最好的解決方案是在一個數據庫查詢中獲取數據,但現在可能就是這樣。將兩個列表中的數據合併到一個對象中
所以我的問題是,什麼是最好的方式加入這些名單,讓我們說List<Object3>
?
我會
由此產生的順序將在第二個列表中。
聲音合理,我會嘗試:) –
謝謝,它的工作 –
使用Apache Common BeanUtils,因爲您不必編寫大量代碼,數據類型轉換也是適當的。
在這種情況下,object1List和object2List應該基於ID的順序相同。爲了有一個比較的使用界面,這基於兩個Object1和Object2的ID
示例代碼
Object1.java
public class Object1 implements Comparable<Object1>{
private Integer id;
private String name;
private int quantity;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int compareTo(Object1 compareObject1) {
int compareId = ((Object1) compareObject1).getId();
//ascending order
return this.id - compareId;
}
}
Object2.java
public class Object2 implements Comparable<Object2>{
private Integer id;
private double amount ;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public int compareTo(Object2 compareObject2) {
int compareId = ((Object2) compareObject2).getId();
//ascending order
return this.id - compareId;
}
}
排序Object3.java將具有與Object1和Object2.java相同的字段名稱
實際執行
int cnt = 0;
List<Object3> object3List = new ArrayList<Object3>();
List<Object1> object1List = Collections.sort(object1List);
List<Object2> object2List = Collections.sort(object2List);
for(Object1 obj1 : object1List) {
BeanUtils.copyProperties(obj3, obj1);
Object2 obj2 = object2List.get(cnt);
BeanUtils.copyProperties(obj3, obj2);
object3List.add(obj3);
cnt ++;
}
'BeanUtils'需要'obj3'和'obj1'具有同名的屬性聲明 –
通過ID確保查詢命令,然後就遍歷列表的同時,同時創建新的超級名單。這不是萬無一失的,如果查詢返回不同的ID集合,那麼數據將被損壞。你可以在添加兩個對象到超級列表之前添加一個檢查以確保id匹配。
如果equals和hashCode正在使用ID,並且它們應該如果這代表對象中的唯一性,那麼也可以使用集合而不是列表。這樣你就可以做些類似於set1.addAll(set2)
我會用BidiMap
(見Apache Commons Collections)。
而且,如果你確定兩個列表具有相同的大小和每個id
是兩個列表中存在的,你可以排序的id
列表,並通過他們去與經典爲循環。
Comparator<YourObject> comparator = new Comparator<YourObject>() {
@Override
public int compare(YourObject o1, YourObject o2) {
return o1.getId().compareTo(o2.getId());
}
};
Collections.sort(list1, comparator);
Collections.sort(list2, comparator);
// import org.apache.commons.collections.BidiMap;
// import org.apache.commons.collections.bidimap.DualHashBidiMap;
BidiMap map = new DualHashBidiMap();
// required: list1.size() == list2.size()
for (int i = 0; i < list1.size(); i++) {
map.put(list1.get(i), list2.get(i));
}
那麼這些鏈接列表,對不對? 'list1.get(0)'應該鏈接到最後一個對象中的'list2.get(0)'? – sp00m
不,聯接應基於ID而不是按元素順序。例如,'list1.get(23)'應該與'list2.get(1)'連接,因爲它們的ID相同。 –