我有一个简单的对象类,它有两个字段:id
& name
public class MyObject{
private int id; //unique id for each instance of MyObject
private String name;
//Setter & Getter
...
}
现在我有两个List
个实例,每个实例都有List
个MyObject
:
/*it holds a list of MyObject*/
List<MyObject> list_origin = GET_MyObject1();
/*it holds a subset of above list, moreover, the subset objects with the
same 'id' as objects in above list have different 'name' value*/
List<MyObject> list_update = GET_MyObject2();
list_update
实际上拥有list_origin
的子集,但已更新(不同)name
值。
现在,我需要使用list_origin
更新list_update
(即将list_origin
中的对象替换为list_update
中的对象),最有效的方式是什么?做到了吗?
答案 0 :(得分:0)
如果使用list_update
方法获得List.subList
,则不必关心更新,因为两个列表都将指向相同的公共对象(将共享引用)。
如果没有,我会考虑使用Map<Integer, String>
个实例而不是List<MyObject>
个实例:
Map<Integer, String> list_origin = GET_MyObject1();
Map<Integer, String> list_update = GET_MyObject2();
for(Entry<Integer, String> entry : list_update.entrySet()){
list_origin.put(entry.getKey(), entry.getValue());
}
答案 1 :(得分:0)
总的程序很可能是:
list_update
list_update
的每个元素,找到与list_origin
- id
变量匹配的int
的相应元素的索引。使用ArrayList.set(index, E)
方法更新元素。总共需要 O(n^2)
费用。
优化:
MyObject
Comparable<MyObject>
课程具有可比性
list_origin
Collection.sort(list_origin)
进行排序
Collections.binarySearch(list, key)
方法查找索引
目标对象和更新结果这需要总共花费 O(nlogn)
。
作为一个例子,您的MyObject
课程将如下:
class MyObject implements Comparable<MyObject>{
private int id;
private String name;
public MyObject(int x, String name) {
this.id = x;
this.name = name;
}
public void updateName(String name)
{
this.name = name;
}
@Override
public int compareTo(MyObject o) {
return Integer.compare(id, o.id);
}
}
然后更新list_origin
:
Collections.sort(list_origin);
for(MyObject obj: list_update)
{
int indx = Collections.binarySearch(list_origin, obj);
list_origin.set(indx, obj);
}