如何对向量中的项目进行排序
How to sort items inside a vector
我有一个向量[(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))
这解决了您问题的第一部分。为了处理决胜局,我们希望能够说“如果第二个元素相同,则通过第一个元素”,事实上 Rust 有一个方法可以做到这一点:Ordering::then
.
sort_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)))
注意:这将在每种情况下评估两种排序,这可能没问题。如果您的比较函数异常昂贵,您可能会考虑 then_with
,它采用闭包而不是值作为参数。
这是一种方法:
ve.sort_unstable_by(|a, b| (b.1, b.0).cmp(&(a.1, a.0)));
请注意,我使用了 sort_unstable_by()
, which, in your case, would have the same effect as sort_by()
,但速度更快,占用的内存更少。
Silvio 的建议也可以使用 sort_unstable_by
:
稍微优化一下
ve.sort_unstable_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)));
这是我想到的另一种方式:
ve.sort_unstable_by_key(|k| (-k.1, -k.0));
我有一个向量[(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))
这解决了您问题的第一部分。为了处理决胜局,我们希望能够说“如果第二个元素相同,则通过第一个元素”,事实上 Rust 有一个方法可以做到这一点:Ordering::then
.
sort_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)))
注意:这将在每种情况下评估两种排序,这可能没问题。如果您的比较函数异常昂贵,您可能会考虑 then_with
,它采用闭包而不是值作为参数。
这是一种方法:
ve.sort_unstable_by(|a, b| (b.1, b.0).cmp(&(a.1, a.0)));
请注意,我使用了 sort_unstable_by()
, which, in your case, would have the same effect as sort_by()
,但速度更快,占用的内存更少。
Silvio 的建议也可以使用 sort_unstable_by
:
ve.sort_unstable_by(|x, y| y.1.cmp(&x.1).then(y.0.cmp(&x.0)));
这是我想到的另一种方式:
ve.sort_unstable_by_key(|k| (-k.1, -k.0));