我覺得TreeRangeSet
實現是越野車。
RangeSet Guava javadoc定義了下面的合同:
實現,選擇支持add(範圍)操作需要忽略>空範圍和聚結連接範圍。例如:
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(1, 10)); // {[1, 10]}
rangeSet.add(Range.closedOpen(11, 15)); // disconnected range; {[1, 10], [11, 15)}
rangeSet.add(Range.closedOpen(15, 20)); // connected range; {[1, 10], [11, 20)}
rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 20)}
rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 20)}
事實上的TreeRangeSet
的實現執行以下操作(注意有關[11, 20)
/[11, 15), (15, 20)
的區別:
rangeSet.add(Range.closed(1, 10)); // {[1, 10]}
rangeSet.add(Range.closedOpen(11, 15)); // {[1, 10], [11, 15)}
rangeSet.add(Range.open(15, 20)); // disconnected range; {[1, 10], [11, 15), (15, 20)}
rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 15), (15, 20)}
rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 15), (15, 20)}}
有幾種情況:
[1, 10] + [11, 15)
不合並,但他們連接...
[10, 15) + (15, 20)
沒有合併,因爲它們已斷開連接,所以沒有問題。然而,在javadoc代碼段的評論說,它應該合併...
[10, 10] + [11, 20)
不合並,但它們連接...
我認爲你可以做到這一點,直到它是固定的,唯一的辦法就是增加「closedOpen」的範圍,用上限設爲您的實際的上界+ 1:
你可以做任何@ LouisWasserman」的方式,或:
rangeSet.add(Range.closedOpen(1, 11)); // {[1, 11)}
rangeSet.add(Range.closedOpen(11, 21)); // {[1, 21)}
您還可以創建爲 「自動」 的UPPERBOUND招的方法,例如:
public void addRangeToSet(int lowerBound, int upperBound, RangeSet<Integer> set){
set.add(Range.closedOpen(lowerBound, upperBound + 1));
}
...
addRangeToSet(1, 10, set); // {[1, 11)}
addRangeToSet(11, 20, set); // {[1, 21)}
rangeSet.add(Range.closedOpen(1, 10)); // {[1, 10)}
rangeSet.add(Range.closedOpen(11, 20)); // {[1, 21)}
編輯
isConnected
method JavaDoc指出:
請注意,某些離散範圍不被視爲連接,即使沒有元素「他們之間。」例如,[3,5]不被視爲連接到[6,10]。在這些情況下,在測試連通性之前,可能希望兩個輸入範圍都使用規範(DiscreteDomain)進行預處理。
所以 「最好」 的辦法似乎是@ LouisWesserman的一個:
rangeSet.add(Range.closed(1, 10).canonical(DiscreteDomain.integers()); // {[1, 11)}
rangeSet.add(Range.closed(11, 20).canonical(DiscreteDomain.integers()); // {[1, 21)}
你能提供一個例子,其中這個問題? –
它與日期有關,但我想保持簡單。如果你從1月1日到11日以及1月12日到20日工作,你實際上從1日到20日工作。我需要將信息保存在我的應用程序中。 –