2016-10-14 23 views
0

我正在構建一個配對系統,該系統應該創建兩個用戶之間的配對並在會議中安排它們。選擇是基於我很難找出的標準。標準是兩人之間不存在較早的比賽。從歷史上尚未存在的列表中生成對

我的輸入是包含電子郵件地址的大小爲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流看起來很有趣,可能是解決這個問題的一種方法,但是我很不幸很遺憾。這裏

+0

所以在上面的例子中1:515是一個有效的輸出(並且許多其他對也是有效的......)? – Amit

+0

那麼如果兩個用戶有前一對,他們現在更可能成對呢?或更少? –

+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嘗試,直到我發現它不可能。

我知道,這是不是很有效的時候有一個大的數字集,但我的數據集將永遠不會那麼大,所以我認爲它會足夠好。