我遇到了以下情况,并且想知道最佳解决方案。假设我有List<Object1>
和List<Object2>
,这些列表是两个分离查询的结果。它们都具有相同的大小,并且基于ID的列表中的元素之间存在1:1的关系。我知道最好的解决方案是在一个数据库查询中获取数据,但现在可能就是这样。将两个列表中的数据合并到一个对象中
所以我的问题是,什么是最好的方式加入这些名单,让我们说List<Object3>
?
我遇到了以下情况,并且想知道最佳解决方案。假设我有List<Object1>
和List<Object2>
,这些列表是两个分离查询的结果。它们都具有相同的大小,并且基于ID的列表中的元素之间存在1:1的关系。我知道最好的解决方案是在一个数据库查询中获取数据,但现在可能就是这样。将两个列表中的数据合并到一个对象中
所以我的问题是,什么是最好的方式加入这些名单,让我们说List<Object3>
?
我会
由此产生的顺序将在第二个列表中。
声音合理,我会尝试:) –
谢谢,它的工作 –
使用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 ++;
}
'BeanUtils'需要'obj3'和'obj1'具有同名的属性声明 –
通过ID确保查询命令,然后就遍历列表的同时,同时创建新的超级名单。这不是万无一失的,如果查询返回不同的ID集合,那么数据将被损坏。你可以在添加两个对象到超级列表之前添加一个检查以确保id匹配。
如果equals和hashCode正在使用ID,并且它们应该如果这代表对象中的唯一性,那么也可以使用集合而不是列表。这样你就可以做些类似于set1.addAll(set2)
我会用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));
}
那么这些链接列表,对不对? 'list1.get(0)'应该链接到最后一个对象中的'list2.get(0)'? – sp00m
不,联接应基于ID而不是按元素顺序。例如,'list1.get(23)'应该与'list2.get(1)'连接,因为它们的ID相同。 –