2016-09-04 6 views
-2

Я хочу карту, которая assignes RangeSets к Целые таким образом, что вместо того, чтобы:Есть ли способ иметь такую ​​карту, как ArrayListMultimap, но с RangeSet и "coalescing" вместо этого?

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 и скомбинируйте его, если ключ существует.

+2

Так что мешает вам написания класс делает это? – Andreas

+1

Если вы используете Java 8, вы можете просто написать 'sensorIDsWithTimeRange.computeIfAbsent (sensorId, k -> TreeRangeSet.create()). Add (range)'; –

ответ

2

Вы можете использовать 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)]}