Sorting x/y坐标的排序向量

Sorting x/y坐标的排序向量,sorting,rust,Sorting,Rust,我有一个(u32,u32)元组的向量,它表示10 x 10网格上的坐标。坐标未排序。因为标准的sort函数也没有产生我想要的结果,所以我为他们编写了这样的排序函数: vec.sort_by(|a, b| { if a.0 > b.0 { return Ordering::Greater; } if a.0 < b.0 { return Ordering::Less; } if a.1 > b.1 { return Ordering::Greater;

我有一个
(u32,u32)
元组的向量,它表示10 x 10网格上的坐标。坐标未排序。因为标准的
sort
函数也没有产生我想要的结果,所以我为他们编写了这样的排序函数:

vec.sort_by(|a, b| {
    if a.0 > b.0 { return Ordering::Greater; }
    if a.0 < b.0 { return Ordering::Less; }

    if a.1 > b.1 { return Ordering::Greater; }
    if a.1 < b.1 { return Ordering::Less; }

    return Ordering::Equal;
});
这不是我想要的,因为左下角应该以
(0/0)
开头,正如我在数学坐标网格上所期望的那样


我可能可以设法在排序算法中添加更多的案例,但是除了编写一个大的
if。。退货订单块?

您没有显示如何填充或打印元组,因此这是一个猜测。翻转和/或否定部分坐标。我还建议使用
sort_by_key
,因为这样更容易,而且只需重用现有的元组比较:

fn main() {
    let mut points = [(0, 0), (1, 1), (1, 0), (0, 1)];
    points.sort_by_key(|&(x, y)| (!y, x));
    println!("{:?}", points);
}
在输出中添加额外的换行符:

[(0,1)、(1,1),
(0, 0), (1, 0)]
最初,这个答案建议对该值取反(
(-y,x)
)。但是,对于无符号整数或值为最小值的有符号整数,此操作失败。否定比特恰好工作得很好,但有点太“聪明”

现在,为了清楚起见,我将使用和:

fn main() {
    let mut points = [(0u8, 0u8), (1, 1), (1, 0), (0, 1)];
    points.sort_by(|&(x0, y0), &(x1, y1)| y0.cmp(&y1).reverse().then(x0.cmp(&x1)));
    println!("{:?}", points);
}
[(0,1)、(1,1),
(0, 0), (1, 0)]

谢谢,我一定是忽略了
按键排序
。我想
!y
将是比
-y
更好的选择(基本上相当于
!y+1
)。对于有符号整数,
-y
将在::MIN中对
进行错误排序。对于无符号整数,
-y
是编译时错误(如果不是,则0将被错误排序)。