2

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

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

4

5 回答 5

3

我会

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

结果顺序将是第二个列表中的顺序。

于 2012-10-01T09:39:33.510 回答
1

我会使用一个BidiMap(参见Apache Commons Collections)。

此外,如果您确定这两个列表具有相同的大小并且每个列表都id存在于两个列表中,您可以按 对列表进行排序id并使用经典的 for 循环遍历它们。

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));
}
于 2012-10-01T10:01:18.820 回答
1

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

在这种情况下,object1List 和 object2List 都应该基于 ID 以相同的顺序排列。要让它使用 Comparable 接口根据 Object1 和 Object2 的 ID 对它们进行排序

示例代码

对象1.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; 
    }   
}

对象2.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 ++;
}
于 2012-10-01T09:47:17.623 回答
1

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

于 2012-10-01T09:47:35.843 回答
0

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

于 2012-10-01T09:49:31.547 回答