Guava中RangeMap自定义range区间

本文介绍了Guava库中的RangeMap接口,它用于映射不相交的Range到特定值。RangeMap不允许相邻区间合并,常见的实现包括ImmutableRangeMap和TreeRangeMap。自定义Range对象需要实现Comparable接口以确保区间排序。文章还提到写作过程中参考了相关文献,并欢迎读者指出不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.youkuaiyun.com/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;
    }
}


    由于时间有限,在写博文的过程中参考过一些文献,在此表示感谢;同时鉴于水平原因,你难免有不足之处,欢迎斧正!


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值