У меня есть вектор (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 ...;
?
Спасибо, я должен проглядел 'sort_by_key'. – Max
Я думаю, что '! Y' будет лучшим выбором, чем' -y' (что в основном эквивалентно '! Y + 1'). Для целых чисел со знаком '-y' неправильно сортирует' iN :: MIN'. Для целых чисел без знака '-y' является ошибкой времени компиляции (если бы это было не так, то 0 было бы неправильно отсортировано). –