我想在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()))));
    

    如果第一个字段的类型很难或不可能获得“下一个更大的值”,则rangetake_while的组合将提供正确的结果,尽管开销很小。
    let range = my_btree_map
        .range((Excluded((1, some_cstr)), Unbounded))
        .take_while(|&((i, _), _)| *i == 1);
    

    09-16 18:49