该算法比较两个列表,即同步表

时间:2015-08-30 16:22:42

标签: java algorithm list synchronization compare

该算法比较两个列表列表,同步表

我需要将本地表与从服务器加载的表同步。决定将列表(本地列表和服务器)的两个阶段进行比较。最初,列表已排序。它仍然是比较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();
    }
}

2 个答案:

答案 0 :(得分:0)

我不确定我明白你在说什么。如果你只想制作本地List =服务器列表,我会做如下的事情:

for(int i = 0; i < server.size(); i++)
{
    local.set(i, server.get(i));
}

这将迭代服务器ArrayList中的所有项,并将它们更改为本地ArrayList中的值

答案 1 :(得分:0)

  • 如果元素出现在两个列表中 - &gt;更新项目。
  • 如果元素仅出现在本地列表中 - &gt;删除项目。
  • 如果元素仅出现在服务器列表中 - &gt;添加项目。

我是对的吗?如果是这样,有两种方法可以实现您的目标(只有第二种解决方案可以排序列表)。

第一次尝试很慢但很短:

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));
}