1

最近、整数の配列を昇順に並べ替える方法を学びました。ゲームをプログラミングしようとしていますが、その一部にはレイヤード テクスチャ レンダラーの作成が含まれていました。ただし、2 つのオブジェクトがまったく同じレベル (y 位置が同じ) の場合、並べ替えプロセスにより、そのうちの 1 つが消えます。

どうしてこれなの?これが私のコードです:

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

与えられたypos値に対して のインデックスvがある場合、これらのインデックスの最大値を に書き込み、残りのインデックスは常に上書きされます。したがって、対応するオブジェクトは に記録されません。mypos[k] == vmfinalOrderm-1finalOrder

これを修正するには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 に答える