56 lines
1.6 KiB
Rust
56 lines
1.6 KiB
Rust
// Напиúите обобщенную функцию 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")
|
||
}
|