Scala中是否有范围数据结构?
我正在寻找一种在Scala中处理范围的方法。 我需要做的是: 给定一组范围和一个范围(a),返回范围(B),其中范围(a)与范围(B)相交,范围(B)不为空 给定一组范围和一个范围(a),从该组范围中删除/添加范围(a) 给定范围(A)和范围(B)创建范围(C)=[最小(A,B),最大(A,B)] 我在java中看到了类似的东西- 尽管Scala中是否有范围数据结构?,scala,range,rangeset,Scala,Range,Rangeset,我正在寻找一种在Scala中处理范围的方法。 我需要做的是: 给定一组范围和一个范围(a),返回范围(B),其中范围(a)与范围(B)相交,范围(B)不为空 给定一组范围和一个范围(a),从该组范围中删除/添加范围(a) 给定范围(A)和范围(B)创建范围(C)=[最小(A,B),最大(A,B)] 我在java中看到了类似的东西- 尽管subRangeSet只返回相交值,而不返回与之相交的集合(或范围列表)中的范围 RangeSet rangeSet = TreeRangeSet.create
subRangeSet
只返回相交值,而不返回与之相交的集合(或范围列表)中的范围
RangeSet rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(0, 10));
rangeSet.add(Range.closed(30, 40));
Range range = Range.closed(12, 32);
System.out.println(rangeSet.subRangeSet(range)); //[30,32] (I need [30,40])
System.out.println(range.span(Range.closed(30, 40))); //[12,40]
正如Tzach Zohar在评论中提到的,如果您只需要Int-go的范围,就可以使用scala.collection.immutable.range:
val rangeSet = Set(0 to 10, 30 to 40)
val r = 12 to 32
rangeSet.filter(range => range.contains(r.start) || range.contains(r.end))
如果您需要将它用于另一个底层类型,那么您可以自己实现它,这对于您的用例来说很容易。在这个示例中有一个
间隔[A]
类型。这允许使用定义顺序的任意类型的范围
。边界可以是包含的、独占的或省略的。例如,(-∞, 0.0]
或[0.0,1.0)
可能是双打间隔
这里有一个库,用于处理非重叠间隔集(or)以及间隔到任意值的映射()
下面是一个示例,介绍如何将IntervalSeq与DateTime一起使用
请注意,如果要使用的类型为64位或更少(基本上是任何基元),IntervalTrie的速度非常快。请参阅。如果它必须是一个整数范围,
scala.collection.immutable.range
可能会起作用吗?