/** * This method sets new counter value for given element * * @param element element to be updated * @param count new counter value * @return previous value */ public double setCount(T element, double count) { AtomicDouble t = map.get(element); if (t != null) { double val = t.getAndSet(count); dirty.set(true); return val; } else { map.put(element, new AtomicDouble(count)); totalCount.addAndGet(count); return 0; } }
@Override public void serialize(AtomicDouble atomicDouble, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeNumber(atomicDouble.doubleValue()); } }
@Override public boolean equals(Object o){ //NOTE: com.google.common.util.concurrent.AtomicDouble extends Number, hence this class extends number if(o instanceof Number){ return get() == ((Number)o).doubleValue(); } return false; }
public void incrementCount(T element, double inc) { AtomicDouble t = map.get(element); if (t != null) t.addAndGet(inc); else { map.put(element, new AtomicDouble(inc)); } totalCount.addAndGet(inc); }
/** * This method sets new counter value for given element * * @param element element to be updated * @param count new counter value * @return previous value */ public double setCount(T element, double count) { AtomicDouble t = map.get(element); if (t != null) return t.getAndSet(count); else { map.put(element, new AtomicDouble(count)); return 0; } }
/** * This method effectively resets counter to empty state */ public void clear() { map.clear(); totalCount.set(0.0); dirty.set(false); }
@Override public AtomicDouble deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { JsonNode node = jsonParser.getCodec().readTree(jsonParser); double value = node.asDouble(); return new AtomicDouble(value); } }
public void incrementCount(T element, double inc) { AtomicDouble t = map.get(element); if (t != null) t.addAndGet(inc); else { map.put(element, new AtomicDouble(inc)); } totalCount.addAndGet(inc); }
/** * This method effectively resets counter to empty state */ public void clear() { map.clear(); totalCount.set(0.0); dirty.set(false); }
@Override public AtomicDouble deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { JsonNode node = jsonParser.getCodec().readTree(jsonParser); double value = node.asDouble(); return new AtomicDouble(value); } }
public double getCount(T element) { AtomicDouble t = map.get(element); if (t == null) return 0.0; return t.get(); }
@Override public void serialize(AtomicDouble atomicDouble, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeNumber(atomicDouble.doubleValue()); } }
@Override public int hashCode(){ //return Double.hashCode(get()); //Java 8+ return Double.valueOf(get()).hashCode(); } }
/** * This method returns element with highest counter value * * @return */ public T argMax() { double maxCount = -Double.MAX_VALUE; T maxKey = null; for (Map.Entry<T, AtomicDouble> entry : map.entrySet()) { if (entry.getValue().get() > maxCount || maxKey == null) { maxKey = entry.getKey(); maxCount = entry.getValue().get(); } } return maxKey; }
/** * This method removes given key from counter * * @param element * @return counter value */ public double removeKey(T element) { AtomicDouble v = map.remove(element); dirty.set(true); if (v != null) return v.get(); else return 0.0; }
public PriorityQueue<Pair<T, Double>> asPriorityQueue() { PriorityQueue<Pair<T, Double>> pq = new PriorityQueue<>(Math.max(1,map.size()), new PairComparator()); for (Map.Entry<T, AtomicDouble> entry : map.entrySet()) { pq.add(Pair.create(entry.getKey(), entry.getValue().get())); } return pq; }
public PriorityQueue<Pair<T, Double>> asReversedPriorityQueue() { PriorityQueue<Pair<T, Double>> pq = new PriorityQueue<>(Math.max(1,map.size()), new ReversedPairComparator()); for (Map.Entry<T, AtomicDouble> entry : map.entrySet()) { pq.add(Pair.create(entry.getKey(), entry.getValue().get())); } return pq; }
/** * This method will increment values of this counter, by counts of other counter * * @param other */ public void incrementAll(CounterMap<F, S> other) { for (Map.Entry<F, Counter<S>> entry : other.maps.entrySet()) { F key = entry.getKey(); Counter<S> innerCounter = entry.getValue(); for (Map.Entry<S, AtomicDouble> innerEntry : innerCounter.entrySet()) { S value = innerEntry.getKey(); incrementCount(key, value, innerEntry.getValue().get()); } } }