gpt4 book ai didi

syntax - 什么是最直接的链接比较方法,产生第一个不相等的?

转载 作者:行者123 更新时间:2023-11-29 08:03:06 24 4
gpt4 key购买 nike

对于具有多个可以比较的成员的结构,或者对于 sort_by 回调,比较数据的优先级是很常见的。

// Example of sorting a: Vec<[f64; 2]>, sort first by y, then x,
xy_coords.sort_by(
|co_a, co_b| {
let ord = co_a[1].cmp(&co_b[1]);
if ord != std::cmp::Ordering::Equal {
ord
} else {
co_a[0].cmp(&co_b[0])
}
}
);

是否有更直接的方法来执行多个 cmp 函数,其中只返回第一个不相等的结果?

最佳答案

perform multiple cmp functions, where only the first non-equal result is returned

这基本上就是为元组定义 Ord 的方式。创建一个将您的类型转换为元组并比较它们的函数:

fn main() {
let mut xy_coords = vec![[1, 0], [-1, -1], [0, 1]];

fn sort_key(coord: &[i32; 2]) -> (i32, i32) {
(coord[1], coord[0])
}

xy_coords.sort_by(|a, b| {
sort_key(a).cmp(&sort_key(b))
});
}

因为这很常见,所以有一个方法:

xy_coords.sort_by_key(sort_key);

这对你的情况没有帮助,因为 floating point doesn't implement Ord .

许多可能性之一是在 NaN 上终止程序:

xy_coords.sort_by(|a, b| {
sort_key(a).partial_cmp(&sort_key(b)).expect("Don't know how to handle NaN")
});

另见


There are times when you may not want to create a large tuple to compare values which will be ignored because higher priority values will early-exit the comparison.

Guava's ComparisonChain 窃取一页,我们可以制作一个小型构建器,允许我们使用闭包来避免额外的工作:

use std::cmp::Ordering;

struct OrdBuilder<T> {
a: T,
b: T,
ordering: Ordering,
}

impl<T> OrdBuilder<T> {
fn new(a: T, b: T) -> OrdBuilder<T> {
OrdBuilder {
a: a,
b: b,
ordering: Ordering::Equal,
}
}

fn compare_with<F, V>(mut self, mut f: F) -> OrdBuilder<T>
where F: for <'a> FnMut(&'a T) -> V,
V: Ord,
{
if self.ordering == Ordering::Equal {
self.ordering = f(&self.a).cmp(&f(&self.b));
}
self
}

fn finish(self) -> Ordering {
self.ordering
}
}

这可以像这样使用

struct Thing {
a: u8,
}

impl Thing {
fn b(&self) -> u8 {
println!("I'm slow!");
42
}
}

fn main() {
let a = Thing { a: 0 };
let b = Thing { a: 1 };

let res = OrdBuilder::new(&a, &b)
.compare_with(|x| x.a)
.compare_with(|x| x.b())
.finish();

println!("{:?}", res);
}

关于syntax - 什么是最直接的链接比较方法,产生第一个不相等的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39107085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com