2012-10-01 44 views
0

我遇到了以下情況,並且想知道最佳解決方案。假設我有List<Object1>List<Object2>,這些列表是兩個分離查詢的結果。它們都具有相同的大小,並且基於ID的列表中的元素之間存在1:1的關係。我知道最好的解決方案是在一個數據庫查詢中獲取數據,但現在可能就是這樣。將兩個列表中的數據合併到一個對象中

所以我的問題是,什麼是最好的方式加入這些名單,讓我們說List<Object3>

+1

那麼這些鏈接列表,對不對? 'list1.get(0)'應該鏈接到最後一個對象中的'list2.get(0)'? – sp00m

+0

不,聯接應基於ID而不是按元素順序。例如,'list1.get(23)'應該與'list2.get(1)'連接,因爲它們的ID相同。 –

回答

3

我會

  • 轉換第一單進入地圖與鍵ID和值作爲Object1。
  • 遍歷第二個列表,得到object1對應的object1。
  • 執行合併操作或任何意圖並準備object3並將其放入列表中。

由此產生的順序將在第二個列表中。

+0

聲音合理,我會嘗試:) –

+0

謝謝,它的工作 –

1

使用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 ++; 
} 
+0

'BeanUtils'需要'obj3'和'obj1'具有同名的屬性聲明 –

1

通過ID確保查詢命令,然後就遍歷列表的同時,同時創建新的超級名單。這不是萬無一失的,如果查詢返回不同的ID集合,那麼數據將被損壞。你可以在添加兩個對象到超級列表之前添加一個檢查以確保id匹配。

0

如果equals和hashCode正在使用ID,並且它們應該如果這代表對象中的唯一性,那麼也可以使用集合而不是列表。這樣你就可以做些類似於set1.addAll(set2)

1

我會用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)); 
} 
相關問題