字符串和整数数组排序
字符串和整数数组排序
我在排序数组方面遇到了问题。我正在尝试优化我玩的策略游戏中的一个功能,为此我需要计算我联盟中所有成员之间的距离,首先是与其他成员的距离,以此类推。实际上,计算这个没有问题。但是现在,我想要对距离数组进行“升序”排序,问题是,我需要将相应的昵称与距离配对。我已经搜索了2天,找不到可行的解决方案。
我尝试在对数组进行排序之前将其复制,但我需要未排序的数组,并且使用该排序函数时,它也会对复制进行排序!
实际上,提供的代码是好的,关于距离的准确性,但没有按升序排序。如果我对距离进行排序,昵称将不再对应。我不知道为什么它们按照伪列表的顺序出现,因为它应该通过nSort2()进行排序。
到目前为止,这是我得到的结果:
//排序Distance[i]数组列表 function nSort(arr) { return arr.sort((a, b) => a - b); } //计算距离 function calcDist(xA, yA, xB, yB) { return Math.sqrt(Math.pow((xB-xA), 2)+Math.pow((yB-yA), 2)); } //在这里,我尝试通过索引获取未排序的距离位置,以便按照各自的距离对昵称进行排序 function nSort2(arr_str, arr_nbr) { var arr_nbr2 = arr_nbr.splice(0); var arr_sort = nSort(arr_nbr2); var str_sort = []; arr_str.forEach(function(element, i) { j = arr_sort.indexOf(arr_nbr2[i], i); str_sort[i] = arr_str[j]; }); console.log(str_sort); return str_sort; } var pseudo_list = ["teddy95", "gabrielc", "ngozi"]; //列表(我只放了前3个,以避免编写太多不必要的代码) var x_ = [29, 26, 4]; //X坐标列表 var y_ = [519, 461, 143]; //Y坐标列表 var distance = [[]]; //距离的二维数组(distance[0][0]是成员与自己的距离(显然为0)。 //计算距离并将其存储在二维数组中 y_.forEach(function(element, i) { distance[i] = []; x_.forEach(function(element, j) { distance[i][j] = Math.ceil(calcDist(x_[i], y_[i], x_[j], y_[j])); }); }); //显示升序排序的数组(尝试) y_.forEach(function(element, i) { x_.forEach(function(element, j) { document.write(pseudo_list[i] + ' -> ' + nSort2(pseudo_list, distance[i])[j] + ': ' + distance[i][j] + ''); }); });
问题:字符串和整数数组的排序问题的原因是数据结构过于复杂化,导致了排序过程中出现了重复的结果。
解决方法:简化数据结构,使用一维数组来保存距离信息,并通过对距离数组进行排序来解决问题。
代码如下:
//计算距离 function calcDist(xA, yA, xB, yB) { return Math.sqrt(Math.pow((xB - xA), 2) + Math.pow((yB - yA), 2)); } let players = [{ pseudo: "teddy95", x: 29, y: 519 }, { pseudo: "gabrielc", x: 26, y: 461 }, { pseudo: "ngozi", x: 4, y: 143 } ] let distances = [] players.forEach(function(element, i) { for (let j = i + 1; j < players.length; ++j) { distances.push({ player1: element, player2: players[j], distance: Math.ceil(calcDist(element.x, element.y, players[j].x, players[j].y)) }) } }) distances.sort(function(a, b) { return a.distance - b.distance }) distances.forEach(function(element, i) { document.write(element.player1.pseudo + ' - ' + element.player2.pseudo + ' dist ' + element.distance + '') })
以上代码简化了数据结构,使用一维数组`distances`来保存玩家之间的距离信息。通过遍历计算并存储每对玩家之间的距离,然后对距离数组进行排序,最后输出排序结果。这样就解决了排序问题,并且避免了重复的结果。