1

我最近学习了如何将整数数组按升序排序。我正在尝试编写游戏,其中一部分涉及创建分层纹理渲染器;但是,当两个对象的级别完全相同(y 位置相同)时,其中一个对象会由于排序过程而消失。

为什么是这样?这是我的代码:

public void sort() {
    int i = 0;
    while (i < yposCount) {
        order[i] = ypos[i];
        i++;
    }
    Arrays.sort(order);
    int j = 0;
    while (j < yposCount) {
        int k = 0;
        while (k < yposCount) {
            if (order[j] == ypos[k]) {
                finalOrder[j] = k;
            }
            k++;
        }
        j++;
    }
} 
4

1 回答 1

3
Arrays.sort(order);
int j = 0;
while (j < yposCount) {
    int k = 0;
    while (k < yposCount) {
        if (order[j] == ypos[k]) {
            finalOrder[j] = k;
        }
        k++;
    }
    j++;
}

对于每个值,由于您在找到匹配项后ypos不这样做,因此您总是将每个与数组匹配的索引写入 index 。因此,仅记录最后一个匹配索引。break;kfinalOrderj

如果对于给定的yposv,存在带有 的m索引ypos[k] == v,则将这些索引中最大的m一次写入finalOrder,而其余的m-1索引总是被覆盖。因此相应的对象没有记录在finalOrder.

要解决此问题,j请在找到匹配项并且下一个元素order等于当前元素时增加索引。

Arrays.sort(order);
int j = 0;
while (j < yposCount) {
    int k = 0;
    while (k < yposCount) {
        if (order[j] == ypos[k]) {
            finalOrder[j] = k;
            // Now, if the next `order` is equal, continue looking for that value
            if ((j+1 < yposCount) && (order[j+1] == order[j])) {
                // more of the same ypos values to come
                j++;
            } else {
                // All these ypos values found, end inner loop
                break;
            }
        }
        k++;
    }
    j++;
}
于 2012-12-31T19:03:38.450 回答