有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java算法比较两个列表、同步表

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

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

共 (2) 个答案

  1. # 1 楼答案

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

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

    第一次尝试缓慢但短暂:

    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));
    }
    
  2. # 2 楼答案

    我不确定我是否明白你在说什么。如果您只想使本地列表=服务器列表,我将执行如下操作:

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

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