有没有一种方法可以像 ArrayListMultimap 那样使用 RangeSet 和 "coalescing" 来代替地图?
Is there a way to have a map like ArrayListMultimap but with RangeSet and "coalescing" instead?
我想要一个将 RangeSets 分配给 Integers 的地图,而不是:
Map<Integer, RangeSet> sensorIDsWithTimeRange = new HashMap<>();
if (sensorIDsWithTimeRange.containsKey(sensorId)) {
sensorIDsWithTimeRange.get(sensorId).add(Range.closedOpen(startTime, endTime));
} else {
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closedOpen(startTime, endTime));
sensorIDsWithTimeRange.put(sensorId, rangeSet);
}
我只会写:
sensorIDsWithTimeRange.put(sensorId, Range.closedOpen(startTime, endTime));
如果键不存在,它会创建一个新键,或者如果键存在,则将新范围插入到现有的 RangeSet 中并合并它。
您可以使用 java.util.AbstractMap
快速创建您自己的自定义 Map
类型:
public class RangeSetHashMap<K, V extends Comparable> extends AbstractMap<K, RangeSet<V>> {
private final Map<K, RangeSet<V>> map = new HashMap<>();
public RangeSet<V> put(K key, Range<V> value) {
RangeSet<V> rangeSet = computeIfAbsent(key, k -> TreeRangeSet.create());
rangeSet.add(value);
return rangeSet;
}
@Override
public RangeSet<V> put(K key, RangeSet<V> value) {
return map.put(key, value);
}
@Override
public Set<Entry<K, RangeSet<V>>> entrySet() {
return map.entrySet();
}
}
用法示例:
RangeSetHashMap<Integer, Time> sensorIDsWithTimeRange = new RangeSetHashMap<>();
sensorIDsWithTimeRange.put(0, Range.closedOpen(valueOf("12:30:00"), valueOf("12:40:00")));
sensorIDsWithTimeRange.put(0, Range.closedOpen(valueOf("17:09:42"), valueOf("23:06:33")));
sensorIDsWithTimeRange.put(1, Range.closedOpen(valueOf("04:13:56"), valueOf("04:14:02")));
System.out.println(sensorIDsWithTimeRange);
sensorIDsWithTimeRange.put(0, Range.closedOpen(valueOf("02:11:12"), valueOf("12:45:19")));
System.out.println(sensorIDsWithTimeRange);
示例输出:
{0=[[12:30:00‥12:40:00), [17:09:42‥23:06:33)], 1=[[04:13:56‥04:14:02)]}
{0=[[02:11:12‥12:45:19), [17:09:42‥23:06:33)], 1=[[04:13:56‥04:14:02)]}
我想要一个将 RangeSets 分配给 Integers 的地图,而不是:
Map<Integer, RangeSet> sensorIDsWithTimeRange = new HashMap<>();
if (sensorIDsWithTimeRange.containsKey(sensorId)) {
sensorIDsWithTimeRange.get(sensorId).add(Range.closedOpen(startTime, endTime));
} else {
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closedOpen(startTime, endTime));
sensorIDsWithTimeRange.put(sensorId, rangeSet);
}
我只会写:
sensorIDsWithTimeRange.put(sensorId, Range.closedOpen(startTime, endTime));
如果键不存在,它会创建一个新键,或者如果键存在,则将新范围插入到现有的 RangeSet 中并合并它。
您可以使用 java.util.AbstractMap
快速创建您自己的自定义 Map
类型:
public class RangeSetHashMap<K, V extends Comparable> extends AbstractMap<K, RangeSet<V>> {
private final Map<K, RangeSet<V>> map = new HashMap<>();
public RangeSet<V> put(K key, Range<V> value) {
RangeSet<V> rangeSet = computeIfAbsent(key, k -> TreeRangeSet.create());
rangeSet.add(value);
return rangeSet;
}
@Override
public RangeSet<V> put(K key, RangeSet<V> value) {
return map.put(key, value);
}
@Override
public Set<Entry<K, RangeSet<V>>> entrySet() {
return map.entrySet();
}
}
用法示例:
RangeSetHashMap<Integer, Time> sensorIDsWithTimeRange = new RangeSetHashMap<>();
sensorIDsWithTimeRange.put(0, Range.closedOpen(valueOf("12:30:00"), valueOf("12:40:00")));
sensorIDsWithTimeRange.put(0, Range.closedOpen(valueOf("17:09:42"), valueOf("23:06:33")));
sensorIDsWithTimeRange.put(1, Range.closedOpen(valueOf("04:13:56"), valueOf("04:14:02")));
System.out.println(sensorIDsWithTimeRange);
sensorIDsWithTimeRange.put(0, Range.closedOpen(valueOf("02:11:12"), valueOf("12:45:19")));
System.out.println(sensorIDsWithTimeRange);
示例输出:
{0=[[12:30:00‥12:40:00), [17:09:42‥23:06:33)], 1=[[04:13:56‥04:14:02)]}
{0=[[02:11:12‥12:45:19), [17:09:42‥23:06:33)], 1=[[04:13:56‥04:14:02)]}