【问题标题】:The algorithm compares two lists, synchronization tables该算法比较两个列表,同步表
【发布时间】:2015-08-30 16:22:41
【问题描述】:

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

我需要将本地表与从服务器加载的表同步。决定比较两个阶段的列表(本地列表和服务器)。最初,列表是排序的。它仍然是比较 id 的一个里程碑。

如果 id 在本地列表中,并且服务器不存在,则从本地数据库中删除条目(删除)。如果 id 等于本地服务器然后更新(update)。如果 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();
    }
}

【问题讨论】:

标签: java algorithm list synchronization compare


【解决方案1】:

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

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

这将遍历服务器 ArrayList 中的所有项目并将它们更改为本地 ArrayList 中的值

【讨论】:

  • 不,服务器列表可以>本地列表,或者服务器列表可以
【解决方案2】:
  • 如果元素同时出现在两个列表中 -> 更新项目。
  • 如果元素只出现在本地列表中 -> 删除项目。
  • 如果元素只出现在服务器列表中 -> 添加项。

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

第一次尝试很慢但很短:

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

【讨论】:

  • 是的,你是对的。第一个解决方案不是好主意,因为如果我们需要更新 1 条记录或插入,并且我们有 2 000 条本地记录,那将会很糟糕。第二种解决方案,我们需要检查所有选项:当服务器的元素数量很大时,本地或反之亦然......哦,我忘了添加我的示例的图片
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多