我有一个看起来像这样的数组:
[["Sunday", [user1, user2]], ["Sunday", [user1, user4]], ["Monday", [user3, user2]]]
该数组基本上具有给定日期的所有排列,并具有唯一的用户对。我是通过运行
获得的%w[Su Mo Tu We Th Fr Sa].product(User.all_pairs)
其中User.all_pairs
是每个唯一的用户对。
我现在的目标是将这组嵌套数组组合成日程表,这意味着我希望找到具有唯一日期的长度为7的每个排列。换句话说,我想要每个潜在的一周。我已经拥有了每一个潜在的日子,我拥有所有潜在的用户,现在我只需要编写它们。
我有预感Array.permutation
方法是我需要的,但我不确定在这种情况下我是如何使用它的。或者我应该使用Array.product
?
答案 0 :(得分:1)
如果我理解正确,您希望所有可能的周,每天分配一对用户。你可以这样做:
User.all_pairs.combination(7)
这将为您提供所有可能的方法,让您可以选择7对,并将它们分配到一周中的几天。但是如果你要求每个可能的一周,那么在哪一天分配哪一天也很重要,你还必须对这7对中的每一个进行排列:
User.all_pairs.combination(7).map{|week| week.permutation().to_a}.flatten(1)
现在,这将为您提供所有可能的周数,其中每周表示为包含7对的数组。例如,其中一周可能如下所示:
[(user1, user2), (user1, user3), (user2, user3), (user3, user4), (user1, user4), (user2, user4), (user3, user4)]
然而,这周的数量将是巨大的!如果您有n
个用户,则会有k = n!/2
个对,p = k! / (7! * (k - 7)!)
种方法可以选择7对和p * 7!
个可能的周数。如果您只有5位用户,则可能获得1946482876800周!无论你打算用它做什么,它都是不可能的。
如果你想找到一周的最佳时间表,你可以尝试制作一些贪婪的算法。