Gra*_*ite 6 sorting vector rust
我有一个向量[(5, 1), (9, 1), (4, 2)]
我希望它被排序为[(4, 2), (9, 1), (5, 1)]
每隔一个元素然后第一个元素按降序排序。可以使用sort_by(|x, y| y.cmp(x))函数吗?
这肯定是可能的,并且您使用 的想法是正确的sort_by。您基本上可以按照您建议的方式按第二个元素进行排序。
sort_by(|x, y| y.1.cmp(&x.1))\nRun Code Online (Sandbox Code Playgroud)\n这解决了您问题的第一部分。为了处理决胜局,我们希望能够说“如果第二个元素相同,则按第一个元素”,事实上 Rust 有一个方法可以做到这一点:Ordering::then。
sort_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)))\nRun Code Online (Sandbox Code Playgroud)\n注意:这将在每种情况下评估两种顺序,这可能没问题。如果您的比较函数异常昂贵,您可能会考虑then_with改为采用闭包而不是值作为其参数。
这是一种方法:
ve.sort_unstable_by(|a, b| (b.1, b.0).cmp(&(a.1, a.0)));
Run Code Online (Sandbox Code Playgroud)
请注意,我使用了sort_unstable_by(),在您的情况下,它具有相同的效果,sort_by()但速度更快并且使用更少的内存。
Silvio 的建议还可以通过使用稍微优化sort_unstable_by:
ve.sort_unstable_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)));
Run Code Online (Sandbox Code Playgroud)
我想到了另一种方式:
ve.sort_unstable_by_key(|k| (-k.1, -k.0));
Run Code Online (Sandbox Code Playgroud)