我遇到了以下情况,我想知道最佳解决方案。假设我有List<Object1>
和List<Object2>
,这些列表是两个独立查询的结果。它们都具有相同的大小,并且基于ID的列表中的元素之间存在1:1的关系。我知道最好的解决方案是在一个数据库查询中获取数据,但现在可能。
所以我的问题是,加入这些列表的最佳方式是什么?让我们说List<Object3>
?
答案 0 :(得分:3)
我会
结果订单将是第二个列表中的订单。
答案 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)