【问题标题】:No concept of "size" in Guava's RangeSet / Range?Guava 的 RangeSet / Range 中没有“大小”的概念?
【发布时间】:2014-05-09 00:33:54
【问题描述】:

我渴望在我的程序中使用 Guava 的 RangeSets。尽管具有添加和合并范围的功能,但我也对我的范围的“大小”感兴趣

一些备注:

  • 我感兴趣的范围不是无限的!
  • 我使用的所有范围都是绑定类型“closedOpen”
  • 底层用例是一个离散的时间空间(大小 = 总时间滴答)

这似乎不是内置的(或者我没有看到),我想知道在概念上是否有明确的理由反对这个(这意味着我不应该自己实现一些 getSize() 函数) 与否。

让我们看看我的用例:

RangeSet<Integer> usageTicks = TreeRangeSet.create();
usageTicks.add(Range.closedOpen(3, 7));
usageTicks.add(Range.closedOpen(12,18));
usageTicks.add(Range.closedOpen(18, 23));

int size = usageTicks.hypotheticalGetSizeFunction(); // size = 15

是否有任何理由反对以下内容:

Set<Range<Integer>> setOfRanges = usageTicks.asRanges();
int sum = 0;
for(Range<Integer> range : setOfRanges)
    sum += (range.upperEndpoint() - range.lowerEndpoint());

【问题讨论】:

  • 如果您的范围重叠,则表示您计算了多次时间步长。你想要这个吗?
  • 你能详细说明一下吗?如果我将范围 Range.closedOpen(14,17) 添加到 useTicks,此时与 rangeSet 重叠,则 rangeSet 的新状态根本不会改变 ([[3?7), [12?23)] )。如果添加 Range.closedOpen(6,9),rangeSet 会发生变化 ([[3?9), [12?23)]),但是在迭代和求和的时候,什么都不求和?
  • 好吧,我的错,我想我不明白 RangeSet 做了什么。我想象asRanges() 方法将返回您最初添加的相同范围,在这种情况下,如果它们重叠,我们将求和超过我们想要的。很抱歉!

标签: java range guava intervals


【解决方案1】:

Guava 的 Range 只需要其封闭类型中的一件事:它们实现 Comparable

但并不是所有实现Comparable 的都有距离的概念。例如,您将如何测量两个Strings 之间的距离?

这就是为什么番石榴也有DiscreteDomainContiguousSet的原因;对于前者,您有next()prev()distance() 等方法,这就是您感兴趣的内容。 Guava 的网站上有一个article

【讨论】:

  • 我觉得很尴尬。在了解 DiscreteDomain (或至少阅读您提到的文章中的相关内容)时,我从未接触过列出所有功能的这些文档。美丽的!还要感谢关于 Comparable 假设和不总是存在的距离度量的推理(或者至少必须为字符串选择 Levenshtein 距离)!
  • 没有理由感到尴尬 ;) 即使这些存在,使用它们毕竟是另一回事!
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多