2016-10-27 6 views
1

У меня есть вектор (u32, u32) кортежей, представляющих координаты на сетке 10 x 10. Координаты Unsorted, и я написал функцию сортировки, как это для них:Сортировка вектора координат x/y

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) 

, который не то, что я хочу, потому что нижняя левая должна начинаться с (0/0), как я ожидал бы на математической координаты сетки.

Возможно, мне удастся добавить больше случаев к алгоритму сортировки, но мне интересно, есть ли более простой способ сделать то, что я хочу в Rust, помимо написания большого блока if .. return Ordering ...;?

ответ

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)] 
+0

Спасибо, я должен проглядел 'sort_by_key'. – Max

+2

Я думаю, что '! Y' будет лучшим выбором, чем' -y' (что в основном эквивалентно '! Y + 1'). Для целых чисел со знаком '-y' неправильно сортирует' iN :: MIN'. Для целых чисел без знака '-y' является ошибкой времени компиляции (если бы это было не так, то 0 было бы неправильно отсортировано). –

Смежные вопросы