原創作品,出自 “曉風殘月xj” 博客,歡迎轉載,轉載時請務必註明出處(http://blog.csdn.net/xiaofengcanyuexj)。
由於各種原因,可能存在諸多不足,歡迎斧正!
RangeMap是一種集合類型,它將不相交、且不爲空的Range(key)映射給一個值(Value),RangeMap不可以將相鄰的區間合併,即使這個區間映射的值是一樣的,實現RangeMap也是一個接口,實現它的也只有兩個類,分別爲mmutableRangeMap和TreeRangeMap。其中TreeRangeMap是key有序的。具體區間排序規則就不再說了。
private static void testRangeMap() {
RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closed(1, 10), "aaa");
System.out.println(rangeMap);
rangeMap.put(Range.open(3, 6), "bbb");
System.out.println(rangeMap);
rangeMap.put(Range.openClosed(10, 20), "aaa");
System.out.println(rangeMap);
rangeMap.put(Range.closed(20, 20), "aaa");
System.out.println(rangeMap);
rangeMap.remove(Range.closed(5, 11));
System.out.println(rangeMap);
}
輸入結果爲:
[[1‥10]=aaa]
[[1‥3]=aaa, (3‥6)=bbb, [6‥10]=aaa]
[[1‥3]=aaa, (3‥6)=bbb, [6‥10]=aaa, (10‥20]=aaa]
[[1‥3]=aaa, (3‥6)=bbb, [6‥10]=aaa, (10‥20)=aaa, [20‥20]=aaa]
[[1‥3]=aaa, (3‥5)=bbb, (11‥20)=aaa, [20‥20]=aaa]
遍歷RangeMap的方法
private static void printToConsole(TreeRangeMap<Item, Integer> rangeMap) {
Map<Range<Item>, Integer> rangeStringMap = rangeMap.asMapOfRanges();
Set<Map.Entry<Range<Item>, Integer>> entries = rangeStringMap.entrySet();
for (Map.Entry<Range<Item>, Integer> next : entries) {
Item left = next.getKey().lowerEndpoint();
Item right = next.getKey().upperEndpoint();
String lines = left + "~" + right + " " + next.getValue();
System.out.println(lines);
}
}
Range區間的自定義對象必須實現Comparable接口,這樣才能保證進行區間的劃分。如下
/**
* 日期類,存放年月日
*/
public class Item implements Comparable<Item> {
private int year, month, day;
public Item(int ye, int mon, int da) {
this.year = ye;
this.month = mon;
this.day = da;
}
public Item() {
}
public void setItem(Item item) {
this.year = item.year;
this.month = item.month;
this.day = item.day;
}
@Override
public int compareTo(Item item) {
if (this.year < item.year)
return -1;
else if (this.year == item.year) {
if (this.month < item.month)
return -1;
else if (this.month == item.month) {
if (this.day < item.day)
return -1;
else if (this.day == item.day)
return 0;
else
return 1;
} else
return 1;
} else
return 1;
}
public String toString() {
String date = "";
if (0 == this.month / 10)
date = this.year + "-" + "0" + this.month;
else date = this.year + "-" + this.month;
if (0 == this.day / 10)
date = date + "-" + "0" + this.day;
else date = date + "-" + this.day;
return date;
}
}
由於時間有限,在寫博文的過程中參考過一些文獻,在此表示感謝;同時鑑於水平原因,你難免有不足之處,歡迎斧正!