Guava學習之RangeSet

來源:互聯網
上載者:User

  前面談到了Guava中新引入的Range類,也瞭解了其中的作用,那麼今天來談談Guava中用到Range來的地方:RangeSet類。RangeSet類是用來儲存一些不為空白的也不相交的範圍的資料結構。假如需要向RangeSet的對象中加入一個新的範圍,那麼任何相交的部分都會被合并起來,所有的空範圍都會被忽略。
  講了這麼多,我們該怎麼樣利用RangeSet?RangeSet類是一個介面,需要用它的子類來聲明一個RangeSet型的對象,實現了RangeSet介面的類有ImmutableRangeSet和TreeRangeSet,ImmutableRangeSet是一個不可修改的RangeSet,而TreeRangeSet是利用樹的形式來實現。下面主要談TreeRangeSet的用法:

import com.google.common.collect.*;/** * User: 過往記憶 * Email:wyphao.2007@163.com * Blog: http://www.wypblog.com * Date: 13-7-17 * Time: 下午4:10 */public void testRangeSet(){        RangeSet rangeSet = TreeRangeSet.create();        rangeSet.add(Range.closed(1, 10));        System.out.println(rangeSet);        rangeSet.add(Range.closedOpen(11, 15));        System.out.println(rangeSet);        rangeSet.add(Range.open(15, 20));        System.out.println(rangeSet);        rangeSet.add(Range.openClosed(0, 0));        System.out.println(rangeSet);        rangeSet.remove(Range.open(5, 10));        System.out.println(rangeSet);    }

上面函數的運行結果如下所示:

{[1‥10]}{[1‥10][11‥15)}{[1‥10][11‥15)(15‥20)}{[1‥10][11‥15)(15‥20)}{[1‥5][10‥10][11‥15)(15‥20)}

對Range類的方法不熟悉,請閱讀《Guava學習之Range》。

注意:RangeSet需要充分利用JDK 1.6中NavigableMap特性,所以JDK1.6以下版本無法使用。

那如果我們需要遍曆rangeSet中的所有元素可以用下面方法實現

public void iteratorRangeSet(RangeSet integerRangeSet) {        if(integerRangeSet == null){            return;        }        Set<Range> ranges = integerRangeSet.asRanges();        Iterator<Range> iterator = ranges.iterator();        while(iterator.hasNext()){            Range next = iterator.next();            System.out.println(next);        }}

運行結果:

[1‥5][10‥10][11‥15)(15‥20)

如果我們需要得到rangeSet互補的範圍,我們可以用RangeSet提供的complement()方法,rangeSet.complement()同樣是一個RangeSet,其中的元素也是互不相交、且不為空白的RangeSet,那麼rangeSet的互補集可以像下面這樣來寫:

RangeSet complement = rangeSet.complement();System.out.println(complement);

得到的結果是:

{(-∞‥1)(5‥10)(10‥11)[15‥15][20‥+∞)}

正好是rangeSet的互補。
如果需要在rangeSet中查詢某個元素是否在rangeSet中,可以用contains(C)來實現,其中C extends java.lang.Comparable。比如我想得到上述rangeSet是否包含15,可以這樣寫:

boolean isIn = rangeSet.contains(15);System.out.println(isIn);//false,因為上述範圍不包含元素15.

如果想知道某個元素是在rangeSet中哪個範圍裡面,可以這樣寫:

Range integerRange = rangeSet.rangeContaining(17);System.out.println(integerRange); //輸出(15‥20),因為17被包含在(15‥20)中,所以輸出這個範圍。

如果想知道某個範圍是否包含在rangeSet的範圍中,可以這樣寫:

boolean encloses = rangeSet.encloses(Range.closedOpen(18, 20));System.out.println(encloses);//true.因為範圍(18,20)包含在範圍(15,20)中encloses = rangeSet.encloses(Range.closedOpen(5, 20));System.out.println(encloses);//false.因為範圍(5,20)不被rangeSet中任何範圍包含.

(完)

轉載請註明: 轉載自過往記憶(http://www.wypblog.com/)
本文連結地址: Guava學習之RangeSet(http://www.wypblog.com/archives/538)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.