我最近学习了如何将整数数组按升序排序。我正在尝试对游戏进行编程,其中一部分涉及创建分层的纹理渲染器。但是,当两个对象的高度完全相同(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
处。因此,仅最后匹配的索引保持记录。如果对于给定的
ypos
值v
有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++;
}