我有一个Map,其中存储了指标名称和Ranges,它们代表每个指标的有效期。这样存储起来非常方便:
private Map<String, Range<Long>> metricRanges = new HashMap<>();
当我需要检查给定的时间戳是否在范围内时,我只是检索了键的范围,然后检查了范围是否包含时间戳。
Range<Long> rangeOfDates = metricRanges.get(key);
if (rangeOfDates != null && rangeOfDates.contains(timestamp)) {
return true;
}
但是,我遇到了必须使用不提供Range功能的Google Guava 14.0之前的库的情况。可以用Ranges适当替代数据结构,以检查给定值是否在Range中?
当前,我正在考虑创建一个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;
}
我是否错过了可以实现的其他可选解决方案,例如Guava 14.0之前的版本?
UPD :刚刚找到了一些与我正在寻找的东西接近的东西-来自Apache commons-lang
的Range类。具体是LongRange
实现。
答案 0 :(得分:2)
我将从以下内容开始:
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();
}
}
答案 1 :(得分:0)
如果您要处理时间范围,则可以从Interval
的ThreeTen-Extra中受益,其描述为:
两个时刻之间不可改变的时间间隔。
一个时间间隔表示两个瞬时之间的时间线上的时间。该类存储开始时刻和结束时刻,包括开始时刻和结束时刻。结束时刻始终大于或等于开始时刻。
由于Interval
是在Instant
上运行,而不是长期运行,因此您必须确定在这种情况下是否值得使用它。