2012-10-01 45 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)); 
} 
相关问题