Идиоматический способ получения ключа с наибольшим значением в BTreeMap?

#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);