【问题标题】:Is there a range data structure in Scala?Scala中有范围数据结构吗?
【发布时间】:2016-04-27 00:35:37
【问题描述】:

我正在寻找一种在 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]

【问题讨论】:

  • 如果一定是整数范围,scala.collection.immutable.Range 可能会解决问题?

标签: scala range rangeset


【解决方案1】:

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

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

这是一个related question,它描述了如何将 IntervalSeq 与 DateTime 一起使用。

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

【讨论】:

    【解决方案2】:

    正如 Tzach Zohar 在评论中提到的,如果您只需要 Int 的范围 - 使用 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))
    

    如果您需要它用于其他底层类型 - 自己实现它,这对您的用例来说很容易。

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多