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将被错误排序)。