我正在寻找一种在 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]
最佳答案
有一个Interval[A]
输入 spire math library .这允许使用定义 Order
的任意类型范围。 .边界可以是包含的、排除的或省略的。所以例如(-∞, 0.0]
或 [0.0, 1.0)
将是可能的 double 间隔。
这是一个图书馆intervalset用于处理非重叠区间集( IntervalSeq 或 IntervalTrie )以及区间到任意值的映射( IntervalMap )。
这是一个 related question描述了如何将 IntervalSeq 与 DateTime 一起使用。
请注意,如果您要使用的类型是 64 位或更少(基本上是任何原始类型),则 IntervalTrie 非常快。见 Benchmarks .
关于scala - Scala 中是否有范围数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36863428/