我有一个(u32, u32)
元组的向量,它代表10 x 10网格上的坐标。坐标是未排序的,我为他们写了一个这样的排序函数:
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;
});
因为标准sort
函数也没有产生我想要的结果。我的自定义函数的结果网格如下所示:
(0/0) (0/1) (0/2) (0/3) (0/4) (0/5) (0/6) (0/7) (0/8) (0/9)
(1/0) (1/1) (1/2) (1/3) (1/4) (1/5) (1/6) (1/7) (1/8) (1/9)
(2/0) (2/1) (2/2) (2/3) (2/4) (2/5) (2/6) (2/7) (2/8) (2/9)
...
(9/0) (9/1) (9/2) (9/3) (9/4) (9/5) (9/6) (9/7) (9/8) (9/9)
这不是我想要的,因为左下角应该以{{1}}开头,正如我在数学坐标网格上所期望的那样。
我可能会设法在排序算法中添加更多案例,但我想知道,除了编写一个大的(0/0)
块之外,还有更简单的方法可以在Rust中执行我想要的操作吗?
答案 0 :(得分:3)
您没有展示如何填充或打印元组,所以这是猜测。只需翻转和/或否定部分坐标。我还建议使用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)]