#algorithm #rust #btreemap
#алгоритм #Ржавчина #btreemap
Вопрос:
Мне нужно получить ключ, связанный с наибольшим значением в BTreeMap. (Сделать это наоборот просто.)
Моя попытка до сих пор:
let mut opt_pair: Option<(amp;Foo, u32)> = None;
for (key, value) in my_btreemap { // my_btreemap is known to be non-empty
match opt_pair {
Some(pair) => {
if value > pair.1 {
opt_pair = Some((key, value));
}
},
None => {
opt_pair = Some((key, value));
}
}
}
opt_pair.unwrap().0
Есть ли идиоматический способ сделать это в более функциональном стиле?
Комментарии:
1. разве это не странно? поиск будет O (n)
2. Ожидаете ли вы какого-либо конкретного поведения в случае, если существует несколько «максимальных» значений?
3. @trentcl исправлено, спасибо.
4. @Stargateur
my_btreemap
обычно содержит 1-10 записей, так что O (N) подойдет.5. @MatthieuM. В случае связей мне все равно, какой из них возвращается, пока он стабилен.
Ответ №1:
Используйте iter
для получения итератора каждой пары. Затем вызовите max_by_key
итератор; требуется замыкание, чтобы получить объект для сравнения.
let opt_pair = map
.iter() // get an iterator over the tree
.max_by_key( |p| p.1 ) // check the value of each pair for the max
.unwrap(); // unwrap the result
println!("key: {}, value: {}", opt_pair.0, opt_pair.1);