首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中有范围数据结构吗?

Scala中有范围数据结构吗?
EN

Stack Overflow用户
提问于 2016-04-26 19:19:55
回答 2查看 1.8K关注 0票数 4

我正在寻找一种在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只返回交叉值,而不返回它与之相交的集合(或范围列表)中的范围。

代码语言:javascript
复制
 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]
EN

回答 2

Stack Overflow用户

发布于 2016-04-27 00:25:32

spire math library中有一个Interval[A]类型。这允许使用定义Order的任意类型的范围。边界可以是包含的、排他的或省略的。因此,例如(-∞, 0.0][0.0, 1.0)将是可能的双倍间隔。

下面是一个库intervalset,用于处理非重叠间隔集(IntervalSeqIntervalTrie)以及间隔到任意值的映射(IntervalMap)。

这是一个描述如何在DateTime中使用IntervalSeq的related question

请注意,如果您想要使用的类型是64位或更少(基本上是任何原语),IntervalTrie是非常快的。请参阅Benchmarks

票数 6
EN

Stack Overflow用户

发布于 2016-04-26 20:14:36

正如Tzach Zohar在评论中提到的,如果你需要的是scala.collection.immutable.Range的Int - go范围:

代码语言:javascript
复制
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))

如果你需要它作为另一个底层类型--自己实现它,你的用例很容易实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36863428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档