Метод min_by
Метод min_by возвращает минимальный элемент итератора,
используя для сравнения пользовательскую функцию-компаратор.
Параметром метод принимает функцию, которая получает два
элемента и возвращает значение типа Ordering. Если
итератор пуст, метод возвращает None.
Функция-компаратор должна возвращать:
Ordering::Less, если первый элемент меньше второго,
Ordering::Equal, если элементы равны,
Ordering::Greater, если первый элемент больше второго.
Синтаксис
iter.min_by(|a, b| a.cmp(b))
Пример
Давайте найдём минимальный элемент вектора
vec![3, 1, 4, 1, 5, 9] с помощью функции-компаратора:
fn main()
{
let res = vec![3, 1, 4, 1, 5, 9].iter().min_by(|a, b| a.cmp(b));
println!("{:?}", res);
}
Результат выполнения кода:
Some(1)
Пример
Давайте найдём минимальный элемент по длине строк
в векторе vec!["abcde", "abc", "abcd", "ab"]:
fn main()
{
let res = vec!["abcde", "abc", "abcd", "ab"]
.iter()
.min_by(|a, b| a.len().cmp(&b.len()));
println!("{:?}", res);
}
Результат выполнения кода:
Some("ab")
Пример
Давайте применим min_by к пустому итератору
и посмотрим на результат:
fn main()
{
let res: Option<&i32> = Vec::<i32>::new()
.iter()
.min_by(|a, b| a.cmp(b));
println!("{:?}", res);
}
Результат выполнения кода:
None
Пример
Давайте найдём минимальный элемент с помощью обратного компаратора - фактически это будет максимум:
fn main()
{
let res = vec![3, 1, 4, 1, 5, 9]
.iter()
.min_by(|a, b| b.cmp(a));
println!("{:?}", res);
}
Результат выполнения кода:
Some(9)
Смотрите также
-
метод
min,
который возвращает минимальный элемент итератора -
метод
min_by_key,
который ищет минимум по значению ключа -
метод
max_by,
который возвращает максимальный элемент по правилу -
метод
fold,
который сворачивает итератор в одно значение