为了账号安全,请及时绑定邮箱和手机立即绑定

从笛卡尔积中获取不同记录的算法

从笛卡尔积中获取不同记录的算法

慕后森 2021-07-01 10:19:27
我有两个表(比如,A 和 B)。我的任务是将 B 与 A 同步,即如果 A 中存在但 B 中不存在,则将记录添加到 B;如果 B 中存在但 A 中不存在,则从 B 中删除记录。A 和 B 可以有重复的记录,这样如果 A 中的记录是重复的,那么 B 也应该有重复的记录。A 和 B 中的样本数据      **Table A**                              **Table B**    id    identifier                      id       identifier    100   capital                         1001     bat    201   bat                             1002     bat    202   bat                             1003     bat                                          5010     keyboard为此,我使用外连接从 A 和 B 获取记录,这样我的输出看起来像:    A.id  B.id   identifier    100   null    capital    201   1001    bat    201   1002    bat       201   1003    bat    202   1001    bat    202   1002    bat    202   1003    bat    null  5010    keyboard因此在上面的例子中,100 和 5010 分别是添加和删除候选,这很容易计算。问题是发现 1003 也是删除候选。由于 201 和 202 分别映射到 1001 和 1002。我可以在数据库中做到这一点,通过对数据库中的重复项进行编号,就像在MYSQL 中所做的那样 :在自联接时避免重复记录的笛卡尔积 但是由于一些限制,我只能使用外联接加载上述格式的数据。因此,我需要 JAVA 中的算法来执行上述操作。提前致谢。
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

这是我解决这个问题的方法:

  1. 从表 A 和表 B 中获取数据。

  2. 表 A 和表 B 的桶数据按标识符,使用:

    Map<String, SameBucketObject>

其中 key 是 'identifier' 并且 SameBucketObject 是:

    class SameBucketObject{

      private List<String> idsOfA;

      private List<String> idsOfB;

    // getter, setters, addToList statements  

    }


基本上,我按标识符将表 A 和表 B 的所有元素分组。


在每个桶中,检查 A 的idsOfA元素和 B的元素的计数idsOfB,如果

    sizeOf(idsOfA) < sizeOf(idsOfB) -> add elements with ids in idsOfB List from Table B to Table A

    sizeOf(idsOfA) > sizeOf(idsOfB) -> delete sizeOf(idsOfA) - sizeOf(idsOfB) elements from A from last.

    sizeOf(idsOfA) = sizeOf(idsOfB) -> no action.

这种方法不使用额外的空间


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信