2016-10-27 18 views
1

私は(u32, u32)タプルのベクトルを持っています。これは10 x 10グリッドの座標を表しています。座標はソートされていないと私は彼らのために、このようなソート機能を書いている: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/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) 

:私のカスタム関数の結果のグリッドは、次のようになります。

ソートアルゴリズムに多くのケースを追加することはおそらく可能ですが、ブロックif .. return Ordering ...;を作成する以外に、Rustで必要な処理を行う簡単な方法はありますか?

答えて

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は正しくソートされません)。 –

関連する問題