字符串和整数数组排序

7 浏览
0 Comments

字符串和整数数组排序

我在排序数组方面遇到了问题。我正在尝试优化我玩的策略游戏中的一个功能,为此我需要计算我联盟中所有成员之间的距离,首先是与其他成员的距离,以此类推。实际上,计算这个没有问题。但是现在,我想要对距离数组进行“升序”排序,问题是,我需要将相应的昵称与距离配对。我已经搜索了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] + '');
    });
});

0
0 Comments

问题:字符串和整数数组的排序问题的原因是数据结构过于复杂化,导致了排序过程中出现了重复的结果。

解决方法:简化数据结构,使用一维数组来保存距离信息,并通过对距离数组进行排序来解决问题。

代码如下:

//计算距离
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`来保存玩家之间的距离信息。通过遍历计算并存储每对玩家之间的距离,然后对距离数组进行排序,最后输出排序结果。这样就解决了排序问题,并且避免了重复的结果。

0