如何获取 BTreeMap 中的最后一项?

Posted

技术标签:

【中文标题】如何获取 BTreeMap 中的最后一项?【英文标题】:How can I get the last item in a BTreeMap? 【发布时间】:2016-02-15 09:48:15 【问题描述】:

如果您有一个键/值对(或只是键)的排序映射,那么显而易见的操作之一就是获取第一个或最后一个对(或键)。

C++ 的std::vectorfront()back() 用于此目的。 std::map 没有,但 *map.begin()*map.rbegin()(反向迭代器)可以解决这个问题(假设知道地图不是空的)。

在 Rust 中,获取地图的第一个元素似乎需要 map.iter().next().unwrap() — 丑陋,但考虑到需要进行一些错误检查也许是合理的。

我们怎样才能得到最后一个元素?通过遍历所有元素:map.iter().last().unwrap()?

我看到有Iterator::rev(),那么map.iter().rev().next().unwrap() 是一个合理的选择吗?

【问题讨论】:

为什么要展开?您能否构造代码以便在条件中使用返回值的存在(或不存在)? 好点;我最终为这个用例使用了.unwrap_or(0)。另一方面,我首先需要知道只有一个元素,因此map.iter().next().unwrap() — 获取唯一元素的方式有点笨拙! 【参考方案1】:

btree_map::Iter,由BTreeMap::iter() 返回,实现了DoubleEndedIterator,所以确实,rev() 的方法可以工作,或者you can use the next_back() method directly:

let (key, value) = map.iter().next_back().unwrap();

【讨论】:

【参考方案2】:

https://github.com/rust-lang/rust/issues/31690#issuecomment-184445033

专用方法会提高可发现性,但您可以这样做:

let map: BTreeMap<K, V> = ...;
let min = map.iter().next();
let max = map.iter().next_back();
and the same for BTreeSet.

【讨论】:

【参考方案3】:

Iterator::rev 方法要求 Self 实现 DoubleEndedIterator,因此它应该始终是您的用例的优化和正确选择。

fn rev(self) -> Rev<Self>
where
    Self: DoubleEndedIterator,

【讨论】:

以上是关于如何获取 BTreeMap 中的最后一项?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 ArrayList<String> 中的最后一项 [重复]

Django - 如何从模板中的查询集中获取最后一项

如何在 BTreeMap/BTreeSet 中找到下一个较小的键?

如何获取jQuery集合的某一项

如何使用 pyspark 从列表中获取最后一项?

如何定位动态条目网格行中的第一项和最后一项?