尝试从数组中生成n组唯一对,而不重复项,创建一组只使用数组中所有项的对。
我正在使用javascript。我有一系列说10项我需要生成以下内容:
我正在使用的代码被绊倒了:
arrPlayers = [1,2,3,4,5,6,7,8,9,10]
matchups-week-1 = [[1,2],[3,4],[5,6],[7,8],[9,10]]
matchups-week-2 = [[1,3],[2,4],[5,7],[6,8],[ooops !! ]不能再做[9,10]因此这套不起作用。
你看到9,10对如何将代码描绘成一个角落?你只能生产4对,因为9,10不是唯一的。
我认为这很容易解决,但我被卡住了。关于代码的任何想法都不会将自己描绘成这个“4个角落”的角落?
我正在使用的代码。 ...诚然,我正在抓稻草。这就是我问这个问题的原因。
function CreateMatchups(player_ids){
//Create array of PLAYER IDs where checkbox = checked
arrPlayers = player_ids.split(", ");
arrOpponents = arrPlayers;
arrPrevUsed = GetPrevUsedPairs();
var arrUsed = [];
var arrTempMatchups = [];
var intNumPlayers = arrPlayers.length;
var blnOddNumberOfPlayers = isOdd(intNumPlayers);
if(blnOddNumberOfPlayers){
arrPlayers.push(9999); //bogus id for placeholder player - fix this
}
for (var i = 0; i < arrPlayers.length; i++) {
player_id = arrPlayers[i];
if(!arrUsed.contains(player_id)){
for (var j = 0; j < arrOpponents.length; j++) {
opponent_id = arrOpponents[j];
if((!arrUsed.contains(opponent_id)) && (!arrUsed.contains(player_id)) && (player_id != opponent_id)){
matchup = player_id + "vs" + opponent_id;
if(!arrPrevUsed.contains(matchup)) {
arrTempMatchups.push(matchup);
arrUsed.push(player_id);
arrUsed.push(opponent_id);
}
}
}
}
}
return arrTempMatchups;
}
答案 0 :(得分:1)
它被称为排列。
function pairwise(list) {
if (list.length < 2) { return []; }
var first = list[0],
rest = list.slice(1),
pairs = rest.map(function (x) { return [first, x]; });
return pairs.concat(pairwise(rest));
}
var result = pairwise(['1','2','3','4','5','6','7','8','9','10']);
document.write(JSON.stringify(result));
答案 1 :(得分:1)
当我终于发现如何使用标准术语引用我想要做的事情时,问题的答案就出现了。这个词是:Round Robin Tournament。所以,当我用谷歌搜索&#34; javascript循环赛锦标赛时间表&#34;其中一个结果是this:http://www.devenezia.com/javascript/article.php/RoundRobin2.html。这给了我以编程方式生成对决所需的基础。