找出两个阵列之间的区别

时间:2016-04-02 01:26:10

标签: java arrays

这看起来不像现有的交叉/联合问题(我可能错了)。

我有两个ArrayLists,它包含一个包含值的类,例如

class A {
    private int value;

    public int getValue() {
        return value;
    }
}

我的名单是

ArrayList<A> first, second;

我希望找到来自firstsecond的两个索引,其中第一个索引指向first中的项目,其中相应的值仅在first中但不在second中{1}},其他索引是second中的索引,其值仅在second但不在first中。

例如(从中心行读取,其中有数据):

hit                  *   *
index of first   0   1   2   3
----------------------------------
first.value      1   3   5   7
second.value     1 2   4   6 7 8
----------------------------------
index of second  0 1   2   3 4 5
hit                *   *   *   *

我想要两个1 21 2 3 5索引。

注意:

  1. 我不想使用第三方库
  2. 值是整数并排序,我的返回也必须按顺序排列。
  3. firstsecond的长度不确定 - 任何一个都可能比另一个长。
  4. 感谢。

    PS:任何人都需要更多细节,这是我的问题的简化版本。 first实际上是SQL查询的ResultSet,它是服务器上的所有记录,second是本地记录的列表(或考虑从另一个本地数据库处理),我想要做的是删除服务器上的所有记录(在first中),不包含在本地数据库(second)中,并将这些丢失的记录添加到远程数据库。感谢。

    致@Tibrogargan

    我的目标是逐步将我的本地数据库(sqlite)传输到远程数据库(MySQL)。本地数据库有一个名为LocalId的字段(没有重复而不是主键),当然还有其他内容(~10个字段),除了复制所需字段(~5个字段)到远程数据库外,我也是包括一个字段,用于确定是否从本地数据库中删除记录。

    作为其他要求,我已经将所有本地数据读入ArrayList,在本地数据库上按LocalId排序,并且可以通过rs访问所有远程数据,排序方式为{远程数据库上的{1}}。

    我的早期版本的代码是在本地数据库中查找最后一个LocalId,并在远程数据库上标记其LocalId大于本地数据库上的最大LocalId的所有记录。但是,直到我发现我并不总是删除本地数据库中的尾部记录才正确,因此我发现有必要迭代所有消息并比较存在。

    我不知道是否有任何“更好”的解决方案,但似乎如果我将所有本地消息加载到远程,性能将会很糟糕?

    哦,只需要提一下,只有几十条消息需要被删除并添加到远程,远程和本地数据集上存在的数百到100 + k条记录。确定远程记录是否应标记为已删除的逻辑依赖于本地数据集中是否存在相应的消息(相同LocalId)。

1 个答案:

答案 0 :(得分:2)

由于数组已排序,您可以循环遍历它们,随时检查重复项。这是一些伪代码:

//loop over both arrays at once
int arrayAIndex = 0;
int arrayBIndex = 0;
while (arrayAIndex < arrayA.length && arrayBIndex < arrayB.length) {
  if (arrayA[arrayAIndex] == arrayB[arrayBIndex]) {
    arrayAIndex++;
    arrayBIndex++;
  } else if (arrayA[arrayAIndex] > arrayB[arrayBIndex]) {
    addToResultB(arrayBIndex);
    arrayBIndex++;
  } else if (arrayB[arrayBIndex] > arrayA[arrayAIndex]) {
    addToResultA(arrayAIndex);
    arrayAIndex++;
  }
}

//clean up any elements which were not looked at during the above
while (arrayAIndex < arrayA.length) {
  addToResultA(arrayAIndex);
  arrayAIndex++;
}
while (arrayBIndex < arrayB.length) {
  addToResultB(arrayBIndex);
  arrayBIndex++;
}