您没有展示如何填充或打印元组,所以这是一个猜测。翻转和/或否定部分坐标。我还建议使用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)
)。然而,作为弗朗西斯·加涅 (Francis Gagné) 指出 https://stackoverflow.com/questions/40274792/sorting-vector-of-x-y-coordinates#comment67810637_40275230,当值为最小值时,对于无符号整数或有符号整数,此操作会失败。对位取反恰好可以正常工作,但有点太“聪明”了。
如今,我会使用Ordering::reverse https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.reverse and Ordering::then https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then为了清楚起见:
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)]