Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中是否有范围数据结构?_Scala_Range_Rangeset - Fatal编程技术网

Scala中是否有范围数据结构?

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

我正在寻找一种在Scala中处理范围的方法。 我需要做的是:

给定一组范围和一个范围(a),返回范围(B),其中范围(a)与范围(B)相交,范围(B)不为空

给定一组范围和一个范围(a),从该组范围中删除/添加范围(a)

给定范围(A)和范围(B)创建范围(C)=[最小(A,B),最大(A,B)]

我在java中看到了类似的东西- 尽管
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
可能会起作用吗?