Java 爪哇-如何比较番石榴系列?

Java 爪哇-如何比较番石榴系列?,java,collections,java-8,guava,comparator,Java,Collections,Java 8,Guava,Comparator,我决定创建一个映射来存储度量名称和表示每个度量的有效期的范围。起初,我使用一个TreeRangeMap来存储范围,但由于每个度量都包含一个范围,因此我切换到如下所示的范围 我的目标是,当我从外部API收到度量的范围时,将最新的时间范围保留在默认的\u METRICS\u映射中。 当我有一个表示范围的树形图时,比较它们很容易。我在树状图中添加了新的度量,然后得到如下最大范围: private static Optional<Range<Long>> maxRange(Tre

我决定创建一个映射来存储度量名称和表示每个度量的有效期的范围。起初,我使用一个
TreeRangeMap
来存储范围,但由于每个度量都包含一个范围,因此我切换到如下所示的范围

我的目标是,当我从外部API收到度量的
范围时,将最新的时间范围保留在默认的\u METRICS\u映射中。
当我有一个表示范围的树形图时,比较它们很容易。我在树状图中添加了新的度量,然后得到如下最大范围:

private static Optional<Range<Long>> maxRange(TreeRangeSet<Long> rangeSet) {
    Set<Range<Long>> ranges = rangeSet.asRanges();
    return ranges.stream().max(Comparator.comparing(Range::upperEndpoint));
} 
private静态可选最大范围(TreeRangeSet rangeSet){
设置范围=rangeSet.asRanges();
返回ranges.stream().max(Comparator.comparing(Range::upperEndpoint));
} 

如果没有将范围包装到树状图中,那么比较范围的正确方法是什么

public static final Map<String, Range<Long>> DEFAULT_METRICS_MAP;
static {
        Map<String, Range<Long>> theMap = new HashMap<>();
        theMap.put("Metric1", Range.closed(Long.MIN_VALUE, Long.MAX_VALUE));
        theMap.put("Metric2", Range.closed(10L, 20L));
        theMap.put("Metric3", Range.closed(30L, 50L));
        METRICS_MAP = Collections.unmodifiableMap(theMap);
    }
公共静态最终映射默认度量映射;
静止的{
Map theMap=newhashmap();
映射放置(“Metric1”,范围关闭(Long.MIN_值,Long.MAX_值));
地图放置(“公制2”,量程关闭(10L,20L));
地图放置(“公制3”,量程关闭(30L,50L));
METRICS\u MAP=Collections.unmodifiableMap(theMap);
}

首先,在这种特殊情况下,避免使用
树形映射/树形集是正确的决定。正如我所理解的(如果我错了,请纠正我),您不需要保留所有度量的所有范围。您需要的是每一时刻每个度量的最新范围。
理想情况下,您希望有一种非常快速的检索方法,如:

Range<Long> range = getRange(metric);
以下是完整的示例:

// Better keep this map encapsulated
private final Map<String, Range<Long>> metricRanges = new HashMap<>();

private final Comparator<Range<Long>> comparator = 
                   Comparator.nullsFirst(Comparator.comparing(Range::upperEndpoint));

static {
    // Fill in your map with default ranges
}

public void setRange(String metric, Range<Long> newRange) {
    Range<Long> oldRange = metricRanges.get(metric);
    if (comparator.compare(newRange, oldRange) > 0) {
        metricRanges.put(metric, newRange);
    }
}

public Range<Long> getRange(String metric) {
    return metricRanges.get(metric);
}

您在这里的预期输出是什么?@Xaerxess我希望在比较默认度量映射的范围和从外部API接收到的同一度量的范围后,获得具有最新(最大)时间戳的范围
// Better keep this map encapsulated
private final Map<String, Range<Long>> metricRanges = new HashMap<>();

private final Comparator<Range<Long>> comparator = 
                   Comparator.nullsFirst(Comparator.comparing(Range::upperEndpoint));

static {
    // Fill in your map with default ranges
}

public void setRange(String metric, Range<Long> newRange) {
    Range<Long> oldRange = metricRanges.get(metric);
    if (comparator.compare(newRange, oldRange) > 0) {
        metricRanges.put(metric, newRange);
    }
}

public Range<Long> getRange(String metric) {
    return metricRanges.get(metric);
}
public Optional<Range<Long>> getRange(String metric) {
    return Optional.of(metricRanges.get(metric));
}