该算法比较两个列表列表,同步表
我需要将本地表与从服务器加载的表同步。决定将列表(本地列表和服务器)的两个阶段进行比较。最初,列表已排序。它仍然是比较id的一个里程碑。
如果id在本地列表上,并且服务器不存在,则从本地数据库中删除条目(删除)。如果id等于本地服务器,则更新(更新)。如果id是那里的服务器,并且没有本地,则添加(选择)。我在相位比较中遇到的问题,在某种程度上是错误的,有些是无法预见的。
我抛弃比较算法,我开始写,但无法完成图像和示例。请修改它。图片示例:http://c2n.me/3mMgiZg
List<Integer> server = new ArrayList<>();
List<Integer> local = new ArrayList<>();
DatabaseHandler db = new DatabaseHandler(context);
Iterator<Integer> serIter = server.iterator();
Iterator<Integer> locIter = local.iterator();
int item1 = serIter.next();
int item2 = locIter.next();
while(serIter.hasNext()) {
if (item1 <item2) {
db.addCourse(item1);
item1 = serIter.next();
} else {
if (locIter.hasNext()) {
while (item2 < item1) {
db.deleteCourse(item2);
item2 = locIter.next();
}
if (item1 == item2) {
db.updateCourse(item1);
item2 = locIter.next();
item1 = serIter.next();
}
} else {
while(item1<item2) {
db.addCourse(item1);
item1 = serIter.next();
}
if (item1 == item2) {
db.updateCourse(item1);
item1 = serIter.next();
} else {
db.deleteCourse(item2 );
continue other;
}
}
}
other:
while(item1>item2) {
db.addCourse(item1);
item1 = serIter.next();
}
}
答案 0 :(得分:0)
我不确定我明白你在说什么。如果你只想制作本地List =服务器列表,我会做如下的事情:
for(int i = 0; i < server.size(); i++)
{
local.set(i, server.get(i));
}
这将迭代服务器ArrayList中的所有项,并将它们更改为本地ArrayList中的值
答案 1 :(得分:0)
我是对的吗?如果是这样,有两种方法可以实现您的目标(只有第二种解决方案可以排序列表)。
第一次尝试很慢但很短:
List<Integer> remove = new ArrayList<>(local);
List<Integer> update = new ArrayList<>(server);
List<Integer> add = new ArrayList<>(server);
remove.removeAll(server);
add.removeAll(local);
update.retainAll(local);
第二个解决方案比第一个解决方案表现更好:
List<Integer> update = new ArrayList<>();
List<Integer> remove = new ArrayList<>();
List<Integer> add = new ArrayList<>();
int i, j;
for (i = 0, j = 0; i < local.size() && j < server.size();) {
int l = local.get(i);
int s = server.get(j);
int cmp = Integer.compare(l, s);
if (cmp == 0) {
update.add(l);
i++;
j++;
} else if (cmp < 0) {
remove.add(l);
i++;
} else {
add.add(s);
j++;
}
}
for (int k = i; k < local.size(); k++) {
remove.add(local.get(k));
}
for (int k = j; k < server.size(); k++) {
add.add(server.get(k));
}