我最近学习了如何将整数数组按升序排序。我正在尝试对游戏进行编程,其中一部分涉及创建分层的纹理渲染器。但是,当两个对象的高度完全相同(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++;
    }
}

最佳答案

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值,由于找到匹配项后您没有break;,因此始终将与k数组匹配的每个索引finalOrder写入索引j处。因此,仅最后匹配的索引保持记录。

如果对于给定的yposvm个索引且带有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++;
}

07-27 17:12