Rust:BTreeMap 相等性+不等性范围查询
Rust: BTreeMap equality+inequality range query
我想在 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)。有什么想法吗?
如果您的元组的第一个字段是整数类型,那么您可以对下一个整数值使用独占绑定,并与空 CStr
配对。 (我假设 <&CStr>::default()
是 &CStr
总订单中的 "smallest" 值。)
let range = my_btree_map.range((Excluded((1, some_cstr)), Excluded((2, <&CStr>::default()))));
如果第一个字段的类型很难或不可能获得 "next greater value",那么 range
和 take_while
的组合将给出正确的结果,虽然有一点开销。
let range = my_btree_map
.range((Excluded((1, some_cstr)), Unbounded))
.take_while(|&((i, _), _)| *i == 1);
我想在 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)。有什么想法吗?
如果您的元组的第一个字段是整数类型,那么您可以对下一个整数值使用独占绑定,并与空 CStr
配对。 (我假设 <&CStr>::default()
是 &CStr
总订单中的 "smallest" 值。)
let range = my_btree_map.range((Excluded((1, some_cstr)), Excluded((2, <&CStr>::default()))));
如果第一个字段的类型很难或不可能获得 "next greater value",那么 range
和 take_while
的组合将给出正确的结果,虽然有一点开销。
let range = my_btree_map
.range((Excluded((1, some_cstr)), Unbounded))
.take_while(|&((i, _), _)| *i == 1);