代码之家  ›  专栏  ›  技术社区  ›  samba

Java-有什么可以替代谷歌番石榴范围?

  •  1
  • samba  · 技术社区  · 6 年前

    我有一个映射存储度量名称和范围,表示每个度量的有效期。这样存放很方便:

    private Map<String, Range<Long>> metricRanges = new HashMap<>();
    

    当我需要检查给定的时间戳是否在一个范围内时,我只是为键检索一个范围,然后检查该范围是否包含时间戳。

    Range<Long> rangeOfDates = metricRanges.get(key);
    if (rangeOfDates != null && rangeOfDates.contains(timestamp)) {
        return true;
    }
    

    不过,我面临的情况是,有必要使用谷歌番石榴图书馆前14.0,不提供范围功能。使用允许检查给定值是否在范围内的范围来适当替换数据结构的方法是什么?

    目前我正在考虑创建一个 List<Long> ranges 包含表示上界和下界的两个值。这将允许我检查时间戳是否在这样的“范围”内:

    private Map<String, List<Long>> metricRanges = new HashMap<>();
    List<Long> rangeOfDates = metricRanges.get(key);
    if (timestamp >= rangeOfDates.get(0) && timestamp <= rangeOfDates.get(1)) {
        return true;
    }
    

    我是否错过了一个可以实现的可选解决方案,例如14.0之前的番石榴?

    升级版: 刚刚找到了一个与我所寻找的很接近的东西-一个来自Apache的Range类 commons-lang . 特别是 LongRange 实施。

    2 回复  |  直到 6 年前
        1
  •  2
  •   OldCurmudgeon    6 年前

    我想从以下几个方面开始:

    class Range<T extends Number> {
        private final T start;
        private final T end;
    
        Range(T start, T end) {
            this.start = start;
            this.end = end;
        }
    
        public boolean contains(Number n) {
            return start.longValue() <= n.longValue() && n.longValue() <= end.longValue();
        }
    } 
    
        2
  •  0
  •   Grzegorz Rożniecki    6 年前

    如果你处理的是时间范围,你可以从中受益 Interval ThreeTen-Extra ,其描述如下:

    两个瞬间之间不可变的时间间隔。

    间隔表示两个瞬间之间时间线上的时间。类存储开始和结束实例,包括开始和结束。结束时刻总是大于或等于开始时刻。

    因为 间隔 操作于 Instant s、 不是长时间的,你必须决定是否值得在你的情况下使用它。