Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将NUM数组划分为2个平衡数组_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript 将NUM数组划分为2个平衡数组

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

我将使用一个2d数组,它看起来像是
[[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');
  });

});