2014-03-29 64 views
3

我很想在我的程序中使用Guava的RangeSets。儘管添加和合並範圍的功能,我也對的「尺寸」感興趣。在番石榴的RangeSet /範圍沒有「大小」的概念?

一些言論:

  • 沒有範圍我感興趣的是無限的!
  • 所有我使用範圍是結合型的「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()); 
+0

如果你的範圍重疊,你正在計算一些時間步驟不止一次。你想要這個嗎? – gdiazc

+0

你能詳細說明一下嗎?如果我將範圍Range.closedOpen(14,17)添加到usageTicks(此時與rangeSet重疊),rangeSet的新狀態完全不會改變([[3?7),[12?23)] )。如果添加Range.closedOpen(6,9),rangeSet將會改變([[3?9),[12?23)]),但是當迭代和求和時不會多次求和? – sascha

+0

好吧,我的不好,我想我並不理解什麼'RangeSet'。我想象了''asRanges()''方法會返回最初添加的相同範圍,在這種情況下,如果它們有重疊,我們會加總超過我們想要的。對於那個很抱歉! – gdiazc

回答

6

番石榴的Range只要求其封閉類型的一兩件事:他們實施Comparable

但並非所有實施Comparable的人都有距離的概念。例如,如何測量兩個String之間的距離?

這就是爲什麼番石榴也有DiscreteDomainContiguousSet;與前者你有方法,如next(),prev()distance(),這是你在這裏感興趣的。番石榴的網站上有一個article

+0

我感到尷尬。在瞭解DiscreteDomain的同時(或者至少閱讀你提到的文章),我從來沒有得到這些文檔列出所有的功能。美麗!還要感謝關於可比假設的推理和並不總是存在的距離度量(或者至少一個必須像Strings一樣選擇Levenshtein距離)! – sascha

+0

沒有理由感到尷尬;)即使這些存在,使用它們畢竟是另一回事! – fge