我遇到了以下情况,我想知道最佳解决方案。假设我有List<Object1>
and List<Object2>
,这些列表是两个单独查询的结果。它们都具有相同的大小,并且基于 ID 的列表中的元素之间存在 1:1 的关系。我知道最好的解决方案是在一个数据库查询中获取数据,但现在这是可能的。
所以我的问题是,加入这些列表的最佳方式是什么List<Object3>
?
我会
结果顺序将是第二个列表中的顺序。
我会使用一个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));
}
使用 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 ++;
}
确保查询按 id 排序,然后同时迭代列表,同时创建新的超级列表。这不是万无一失的,如果查询返回不同的 id 集,那么数据将被破坏。不过,在将两个对象添加到超级列表之前,您始终可以添加检查以确保 id 匹配。
如果 equals 和 hashCode 正在使用 ID,并且如果这表示对象中的唯一性,它们应该使用,您也可以使用集合而不是列表。这样你就可以做类似的事情set1.addAll(set2)