"b" (1, 4) => "c" (2, 1) => "d"-6ren">
gpt4 book ai didi

pagination - Rust:BTreeMap 相等性+不等性范围查询

转载 作者:行者123 更新时间:2023-11-29 08:15:11 27 4
gpt4 key购买 nike

我想调用range在 BTreeMap 上,键是像 (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 会很有用在元组内部,但我认为这是不对的。不太有趣的解决方案是拥有多层数据结构(例如第一个字段的 HashMap ,其中键映射到...... 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);

关于pagination - Rust:BTreeMap 相等性+不等性范围查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com