我正在寻找一种在Scala中处理范围的方法。我需要做的是:
给定一组范围和一个范围(A),返回范围(B),其中范围(A)相交范围(B)不为空
给定一组范围和一个范围(A),从该组范围中移除/向该组范围添加范围(A)。
给定range(A)和range(B)创建一个range(C) = min(A,B),max(A,B)
我在java - http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/RangeSet.html中看到了类似的东西,尽管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]发布于 2016-04-27 00:25:32
spire math library中有一个Interval[A]类型。这允许使用定义Order的任意类型的范围。边界可以是包含的、排他的或省略的。因此,例如(-∞, 0.0]或[0.0, 1.0)将是可能的双倍间隔。
下面是一个库intervalset,用于处理非重叠间隔集(IntervalSeq或IntervalTrie)以及间隔到任意值的映射(IntervalMap)。
这是一个描述如何在DateTime中使用IntervalSeq的related question。
请注意,如果您想要使用的类型是64位或更少(基本上是任何原语),IntervalTrie是非常快的。请参阅Benchmarks。
发布于 2016-04-26 20:14:36
正如Tzach Zohar在评论中提到的,如果你需要的是scala.collection.immutable.Range的Int - go范围:
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))如果你需要它作为另一个底层类型--自己实现它,你的用例很容易实现。
https://stackoverflow.com/questions/36863428
复制相似问题