Arrays 从二维阵列中删除交互参照

Arrays 从二维阵列中删除交互参照,arrays,algorithm,language-agnostic,multidimensional-array,Arrays,Algorithm,Language Agnostic,Multidimensional Array,我有一个2D数组,例如: [ [0, 1], // collisionGroup0's references [0, 1, 2], // collisionGroup1's references [0, 1], // collisionGroup2's references ]; 这个数组为我的游戏引擎定义了一个碰撞贴图。假设我有3个碰撞组。从这个数组中,我可以看出: collisionGroup0与collisionGroup0和collisionGroup1碰撞 碰

我有一个2D数组,例如:

[
    [0, 1], // collisionGroup0's references
    [0, 1, 2], // collisionGroup1's references
    [0, 1], // collisionGroup2's references
];
这个数组为我的游戏引擎定义了一个碰撞贴图。假设我有3个碰撞组。从这个数组中,我可以看出:

collisionGroup0与collisionGroup0和collisionGroup1碰撞

碰撞组1与碰撞组0、碰撞组1和碰撞组2碰撞

碰撞组2与碰撞组0和碰撞组1碰撞

我希望这是有道理的

好吧,那么问题是:

我正在寻找一种方法来循环并删除相互引用。因为collisionGroup0与collisionGroup1冲突,而collisionGroup1与collisionGroup0冲突,所以我们只需要一个引用。否则,当我进行实际碰撞检查时,碰撞(现在在我的引擎中发生的情况)会加倍

我希望处理后的最终数组如下所示:

[
    [0, 1], // collisionGroup0's references
    [2], // collisionGroup1's references
    [0, 1], // collisionGroup2's references
];
for (var row : int = 0; row < array.length; ++row)
{
    for (var column : int = 0; column < array[row].length; ++column)
    {
        for (var row2 : int = row + 1; row2 < array.length; ++row2)
        {
            for (var column2 : int = array[row2].length - 1; column2 >= 0; --column2)
            {
                if (array[row][column] == array[row2][column2])
                    array[row2].splice(column2, 1);
            }
        }
    }
}
我现在看到的是这样的:

[
    [0, 1], // collisionGroup0's references
    [2], // collisionGroup1's references
    [0, 1], // collisionGroup2's references
];
for (var row : int = 0; row < array.length; ++row)
{
    for (var column : int = 0; column < array[row].length; ++column)
    {
        for (var row2 : int = row + 1; row2 < array.length; ++row2)
        {
            for (var column2 : int = array[row2].length - 1; column2 >= 0; --column2)
            {
                if (array[row][column] == array[row2][column2])
                    array[row2].splice(column2, 1);
            }
        }
    }
}
因为它没有考虑到collisionGroup2与collisionGroup0不对等这一事实

你知道我错过了什么吗


谢谢

清除冲突目标的索引大于当前索引的任何冲突。所以,举例来说,摆脱下面的**人

[
[0, **1**], // collisionGroup0's references
[0, 1, **2**], // collisionGroup1's references
[0, 1], // collisionGroup2's references
];
因为1>0和2>1。 你可以做相反的事情——但是如果它们是有序的,就像在这个例子中那样,你最终会截断数组,这可能比砍掉它们的头更快更容易

我假设相互引用总是在那里。如果没有,这是无用的