Files
rust-otus/practice/src/bin/f_largest_by_key.rs
2026-01-16 17:01:52 +03:00

56 lines
1.6 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Напиúите обобщенную функцию largest_by_key<T, F, K>(list: &[T], key: F) -> Option<&T>, где:
// ● F: Fn(&T) -> K,
// ● K: PartialOrd.
// Функция должна возвращать элемент с максимальным значением key(item).
fn largest_by_key<T, K: PartialOrd>(list: &[T], key: impl Fn(&T) -> K) -> Option<&T> {
let l_len = list.len();
if l_len < 1 {
return None;
} else if l_len == 1 {
return Some(&list[0]);
}
let mut max = &list[0];
let mut max_key = key(max);
for element in &list[1..] {
let element_key = key(element);
if element_key > max_key {
(max, max_key) = (element, element_key);
}
}
Some(max)
}
fn main() {
// Пример из задания
let words = ["apple", "banana", "cherry"];
let longest = largest_by_key(&words, |s| s.len());
println!("{:?}", longest); // Some("banana")
// Дополнительные примеры
let numbers = [1, 42, 3, 100, 5];
let largest_num = largest_by_key(&numbers, |&n| n);
println!("{:?}", largest_num); // Some(100)
struct Person {
name: String,
age: u32,
}
let people = [
Person {
name: "Alice".to_string(),
age: 30,
},
Person {
name: "Bob".to_string(),
age: 25,
},
Person {
name: "Charlie".to_string(),
age: 35,
},
];
let oldest = largest_by_key(&people, |p| p.age);
println!("Oldest: {:?}", oldest.map(|p| &p.name)); // Some("Charlie")
}