我想在BTreeMap上调用range
,其中的键是像(a,b)
这样的元组。说我们有:
(1, 2) => "a"
(1, 3) => "b"
(1, 4) => "c"
(2, 1) => "d"
(2, 2) => "e"
(2, 3) => "f"
特殊之处在于,我希望所有条目的第一个字段都具有特定值,但要在第二个字段上具有范围,即我希望所有条目都在
a = 1 AND 1 < b <= 4
位置。在这种情况下,RangeBounds
运算符不太复杂,应该是(Excluded((1, 1)), Included((1, 4)))
。如果我的范围是无限制的,例如a = 1 AND b > 3
,我们将具有以下RangeBounds
:(Excluded((1, 3)), Included((1, i64::max_value())))
。当元组内部的类型没有最大值(例如字符串(具体为
CStr
))时,就会出现问题。有办法解决这个问题吗?能够在元组中使用Unbounded
会很有用,但我认为这是不对的。不太有趣的解决方案是具有多层数据结构(例如,第一个字段的哈希图,其中键映射到... BTreeMap)。有什么想法吗? 最佳答案
如果元组的第一个字段是整数类型,则可以对下一个整数值使用排他绑定(bind),并与空CStr
配对。 (我假设<&CStr>::default()
是&CStr
总顺序中的“最小”值。)
let range = my_btree_map.range((Excluded((1, some_cstr)), Excluded((2, <&CStr>::default()))));
如果第一个字段的类型很难或不可能获得“下一个更大的值”,则
range
和take_while
的组合将提供正确的结果,尽管开销很小。let range = my_btree_map
.range((Excluded((1, some_cstr)), Unbounded))
.take_while(|&((i, _), _)| *i == 1);