排序x / y坐标向量

时间:2016-10-27 01:41:58

标签: sorting rust

我有一个(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中执行我想要的操作吗?

1 个答案:

答案 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)]