如何对向量内的项目进行排序

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))函数吗?

Sil*_*olo 6

这肯定是可能的,并且您使用 的想法是正确的sort_by。您基本上可以按照您建议的方式按第二个元素进行排序。

\n
sort_by(|x, y| y.1.cmp(&x.1))\n
Run Code Online (Sandbox Code Playgroud)\n

这解决了您问题的第一部分。为了处理决胜局,我们希望能够说“如果第二个元素相同,则按第一个元素”,事实上 Rust 有一个方法可以做到这一点:Ordering::then

\n
sort_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)))\n
Run Code Online (Sandbox Code Playgroud)\n

注意:这将在每种情况下评估两种顺序,这可能没问题。如果您的比较函数异常昂贵,您可能会考虑then_with改为采用闭包而不是值作为其参数。

\n

在线尝试一下!

\n


at5*_*321 4

这是一种方法:

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)

  • 这是一个很好的方法,因为 Rust 已经知道如何比较元组,无需重复。此外,这也适用于非复制类型:`|a, b| (&b.1, &b.0).cmp(&(&a.1, &a.0))` (2认同)
  • 我个人会选择“ve.sort_unstable_by_key(|&(x, y)| Reverse((y, x)))”,使用“std::cmp::Reverse”。使用否定以相反的顺序排序似乎有点像黑客。 (2认同)