将两个列表中的数据连接到一个对象中

时间:2012-10-01 09:36:34

标签: java list

我遇到了以下情况,我想知道最佳解决方案。假设我有List<Object1>List<Object2>,这些列表是两个独立查询的结果。它们都具有相同的大小,并且基于ID的列表中的元素之间存在1:1的关系。我知道最好的解决方案是在一个数据库查询中获取数据,但现在可能。

所以我的问题是,加入这些列表的最佳方式是什么?让我们说List<Object3>

5 个答案:

答案 0 :(得分:3)

我会

  • 将第一个列表转换为Map,其中key为ID,值为Object1。
  • 遍历第二个列表,获取对应于object2的ID的object1。
  • 执行合并操作或任何预期的操作并准备object3并将其放入列表中。

结果订单将是第二个列表中的订单。

答案 1 :(得分:1)

使用Apache Common BeanUtils,因为您不必编写太多代码,数据类型转换也是正确的。

在这种情况下,object1List和object2List应该基于ID的顺序相同。要使用Comparable接口根据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 ++;
}

答案 2 :(得分:1)

确保查询按ID排序,然后在创建新的超级列表的同时迭代列表。这不是万无一失的,如果查询返回不同的id组,则数据将被破坏。在将两个对象添加到超级列表之前,您总是可以添加一个检查以确保id匹配。

答案 3 :(得分:1)

我会使用BidiMap(请参阅Apache Commons Collections)。

此外,如果您确定两个列表的大小相同两个列表中都存在<{1}} ,您可以对列表进行排序通过id并通过经典循环播放它们。

id

答案 4 :(得分:0)

如果equals和hashCode正在使用ID,并且它们应该表示对象中的唯一性,那么您也可以使用集而不是列表。这样您就可以执行set1.addAll(set2)

之类的操作