Javascript 将NUM数组划分为2个平衡数组
我将使用一个2d数组,它看起来像是Javascript 将NUM数组划分为2个平衡数组,javascript,arrays,sorting,Javascript,Arrays,Sorting,我将使用一个2d数组,它看起来像是[[player1,10],[player2,8],但大约有12个播放器。我对我听到的排序已经足够满意了,除了这个方法,teamA总是得到更好球员的“第一选择”。我正在努力想办法每隔一段时间给B队一个更好的球员。下面是“足够好”的代码 这将导致teamA:[[“player1,10],“player2,8]]和teamB:[[“player4,9],“player3,7] 我更喜欢的是player2和player3交换团队。以下是我尝试过的 // inside
[[player1,10],[player2,8]
,但大约有12个播放器。我对我听到的排序已经足够满意了,除了这个方法,teamA总是得到更好球员的“第一选择”。我正在努力想办法每隔一段时间给B队一个更好的球员。下面是“足够好”的代码
这将导致teamA:[[“player1,10],“player2,8]]
和teamB:[[“player4,9],“player3,7]
我更喜欢的是player2和player3交换团队。以下是我尝试过的
// inside my first for loop
if (3 % i == 0) {
i++;
} else if (4 % i == 0) {
i--;
}
在我的脑子里,这本应该很有效,但哇,没有!我在B队有9名球员,在A队有3名球员。我摆弄了不同的方法,但运气不好
有什么建议吗
编辑:为了澄清,可以假设数据集将不排序,并且数据集的长度将始终是相等的。不会有一个团队的玩家比另一个多。我编辑了您的代码,以便它将首先为teamA选择2个,然后为teamB选择2个,然后为teamA选择2个,依此类推
var data = [
["player1", 10],
["player2", 8],
["player3", 7],
["player4", 9],
["player5", 5],
["player6", 6]
];
var teamA = [];
var teamB = [];
var remaining = [];
for (item in data) {
remaining.push(data[item].slice());
}
var turnA = false;
var counterA = 0,
counterB = 0;
for (i in data) {
var max = 0;
var selection = [, ];
var index = -1;
for (k in remaining) {
if (remaining[k][1] > max) {
selection = remaining[k];
max = remaining[k][1];
index = k;
}
}
remaining.splice(index, 1);
// add first player to teamA and continue
if (i == 0) {
teamA.push(selection);
continue;
}
if (turnA) {
teamA.push(selection);
counterA++;
} else {
teamB.push(selection);
counterB++;
}
if (turnA && counterA == 2) {
counterA = 0;
turnA = false;
} else if (!turnA && counterB == 2) {
counterB = 0;
turnA = true;
}
}
因此,您要采取的策略是分区问题,如下所述: 您基本上希望根据两支球队的球员得分,计算两支球队的总和,比较总和,然后将当前球员分配给得分较低的球队 首先,我们对播放器数据进行排序 在第一次遍历时,我们随机选择一个团队来分配最佳的玩家。在遍历玩家池的其余部分时,我们遵循分区问题中描述的算法 我很快就写了一个分区问题的例子:
//堆栈溢出应答
变量数据=[“玩家1”,10],“玩家2”,8],“玩家3”,7],“玩家4”,9];
var teamA=[];
var teamB=[];
var选择概率=0.5;
剩余var=[];
数据排序(函数(playerA、playerB){
if(playerA[1]playerB[1]){
返回-1;
}
返回0;
});
var sum=功能(团队){
如果(team.length==0){
返回0;
}
var i,
s=0;
对于(i=0;i
玩家数据是否按排序顺序到达?(按玩家点数排序)两个团队在玩家数量上应该是完全相等的,还是A团队有3名玩家,B团队有4名玩家可以?@Thien BachHuynh请参见编辑以获得答案。使用for…in来迭代数组是一种糟糕的做法@MeteorZero有趣。Welp,我想这是我讨厌javascript的另一个原因。:)
var data = [
["player1", 10],
["player2", 8],
["player3", 7],
["player4", 9],
["player5", 5],
["player6", 6]
];
var teamA = [];
var teamB = [];
var remaining = [];
for (item in data) {
remaining.push(data[item].slice());
}
var turnA = false;
var counterA = 0,
counterB = 0;
for (i in data) {
var max = 0;
var selection = [, ];
var index = -1;
for (k in remaining) {
if (remaining[k][1] > max) {
selection = remaining[k];
max = remaining[k][1];
index = k;
}
}
remaining.splice(index, 1);
// add first player to teamA and continue
if (i == 0) {
teamA.push(selection);
continue;
}
if (turnA) {
teamA.push(selection);
counterA++;
} else {
teamB.push(selection);
counterB++;
}
if (turnA && counterA == 2) {
counterA = 0;
turnA = false;
} else if (!turnA && counterB == 2) {
counterB = 0;
turnA = true;
}
}
// stack overflow answer
var data = [["player1", 10], ["player2", 8], ["player3", 7], ["player4", 9]];
var teamA = [];
var teamB = [];
var selectionProbability = 0.5;
var remaining = [];
data.sort(function(playerA, playerB){
if(playerA[1] < playerB[1]) {
return 1;
}
if(playerA[1] > playerB[1]) {
return -1;
}
return 0;
});
var sum = function(team) {
if (team.length === 0) {
return 0;
}
var i,
s = 0;
for(i = 0; i < team.length; i++) {
s += team[i][1];
}
return s;
};
var chooseTeam = function() {
if(Math.random() < selectionProbability) {
return 'teamA';
}
return 'teamB';
};
function assignTeams() {
var i;
for(i = 0; i < data.length; i++) {
var sumA = sum(teamA),
sumB = sum(teamB);
// first pass, we'll have a 50/50 chance
// of placing the best player in either team A or team B
if (i === 0) {
var chosenTeam = chooseTeam();
if (chosenTeam === 'teamA') {
teamA.push(data[i]);
} else {
teamB.push(data[i]);
}
} else if (sumA < sumB) {
teamA.push(data[i]);
} else {
teamB.push(data[i]);
}
}
}
function addPlayerToHtml(player, teamId) {
var li = document.createElement('li'),
text = document.createTextNode(player[0] + ' ' + player[1]);
li.appendChild(text);
document.getElementById(teamId).appendChild(li);
}
var button = document.getElementById('assignPlayers');
button.addEventListener('click', function(){
assignTeams();
teamA.forEach(function(player){
addPlayerToHtml(player, 'teamA');
});
teamB.forEach(function(player){
addPlayerToHtml(player, 'teamB');
});
});