【问题标题】:Java - What could be an alternative to Google Guava Ranges?Java - 有什么可以替代 Google Guava Ranges?
【发布时间】:2019-04-28 00:24:32
【问题描述】:

我有一个地图存储指标名称和范围,代表每个指标的生存期。这样存放很方便:

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

当我需要检查给定的时间戳是否在 Range 中时,我只需检索键的 Range,然后检查 Range 是否包含时间戳。

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

但是,我遇到了需要使用不提供 Range 功能的 14.0 之前的 Google Guava 库的情况。使用 Ranges 可以适当地替换数据结构以允许检查给定值是否在 Range 中?

目前我正在考虑创建一个List&lt;Long&gt; 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;
}

我是否缺少可以实现的更多可选解决方案,例如使用 Guava pre 14.0?

UPD: 刚刚找到了一些与我正在寻找的东西相近的东西 - 来自 Apache commons-lang 的 Range 类。特别是LongRange 实现。

【问题讨论】:

  • "创建列表 范围" List 包含零个或多个值。您似乎只需要 2 个值。创建一个专门建模的类。

标签: java collections guava


【解决方案1】:

我会从以下内容开始:

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();
    }
} 

【讨论】:

  • 为什么是T extends Number?而不是Comparable
  • 因为我想使用T.longValue(),它在Number接口中。
【解决方案2】:

如果您正在处理时间范围,您可以从 IntervalThreeTen-Extra 中受益,描述为:

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

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

因为IntervalInstants 上运行,而不是在 long 上运行,所以您必须决定在您的情况下是否值得使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多