从列表中生成尚未存在的对

时间:2016-10-14 15:18:46

标签: algorithm java-stream pairing

我正在构建一个配对系统,该系统应该在两个用户之间创建配对并在会议中安排它们。选择是基于我很难搞清楚的标准。标准是该对之间不存在较早的匹配。

我的输入是包含电子邮件地址的大小n的列表。该列表应该被分成对。限制是此次匹配以前没有发生过。

例如,我的列表将包含几个用户ID

list = {1,5,6,634,533,515,61,53}

同时我有一个存在旧对的数据库表:

previous_pairs
---------------------
id     date                    status
1      2016-10-14 12:52:24.214 1
2      2016-10-15 12:52:24.214 2
3      2016-10-16 12:52:24.214 0
4      2016-10-17 12:52:24.214 2

previous_pair_users
---------------------
id     userid
1      1
1      5
2      634
2      553
3      515
3      61
4      53
4      1

解决这个问题的好方法是什么?我现在的测试解决方案是弹出两个随机用户并检查它们之前的匹配。如果不存在匹配,则弹出一个新的随机(如果可能)并将其中一个不正确的用户推回列表。如果两个人都是最后一个,他们无论如何都会得到匹配。这对我来说听起来不太好,因为我应该根据已经存在的“现有”对的列表来预测哪些匹配不会发生。

您对如何让我开始构建此程序有任何想法吗? Java 8流看起来很有趣,可能是解决这个问题的一种方法,但不幸的是我对此很新。

1 个答案:

答案 0 :(得分:0)

这里的解决方案是使用MySQL的group_concat功能创建一个包含旧匹配的元组的列表:

SELECT group_concat(MatchProfiles.ProfileId) FROM Matches
INNER JOIN MatchProfiles ON Matches.MatchId = MatchProfiles.MatchId
GROUP BY Matches.MatchId

old_matches = ((42,52),(12,52),(19,52),(10,12))

之后我选择候选者并使用我的pop_random()生成一个新的元组列表

new_matches = ((42,12),(19,48),(10,36))

当两个列表完成后,我会查看交叉点以找到任何重复项

duplicates = list(set(new_matches) & set(old_matches))

如果我们有重复项,我们只需再次运行随机发生器X尝试直到我发现它不可能。

我知道当拥有大量数字时这不是很有效,但我的数据集永远不会那么大,所以我认为这样就足够了。