Java - Что может быть альтернативой Google Guava Ranges? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть карта, хранящая названия метрик и диапазоны, представляющие периоды реального времени для каждой метрики.Хранить его было очень удобно следующим образом:

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

Когда мне нужно было проверить, находится ли данная временная метка в диапазоне, я просто извлек диапазон для ключа, а затем проверил, содержит ли диапазон временную метку..

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

Однако я столкнулся с ситуацией, когда необходимо использовать библиотеку Google Guava до 14.0, которая не обеспечивает функциональность 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 pre 14.0?

UPD: только что нашел что-то близкое к тому, что я искал - класс Range от Apache commons-lang.В частности, реализация LongRange.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если вы имеете дело с временными диапазонами, вы можете воспользоваться Interval из ThreeTen-Extra , который описывается как:

Неизменный интервал времени между двумя моментами.

Интервал представляет время на временной шкале между двумя моментами.Класс хранит начальный и конечный моменты, включая начало и конец.Конечный момент всегда больше или равен начальному моменту.

Поскольку Interval работает на Instant с, а не на длинных, вы должны решить, стоит ли его использовать в вашем случае.

0 голосов
/ 26 ноября 2018

Я бы начал с чего-то вроде:

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