package edu.berkeley.nlp.util; import java.text.NumberFormat; import java.util.SortedSet; import java.util.Map.Entry; public class VariableSizeHistogram { private SortedSet<Double> startPoints; private Counter<Number> data; private boolean intKeys; public VariableSizeHistogram(SortedSet<Double> startPoints) { this(startPoints, true); } public VariableSizeHistogram(SortedSet<Double> startPoints, boolean intKeys) { this.startPoints = startPoints; this.intKeys = intKeys; data = new Counter<Number>(); } public void add(double key, double value) { SortedSet<Double> tailSet = startPoints.tailSet(key); Double startPoint = tailSet.isEmpty() ? startPoints.last() : tailSet.first(); data.incrementCount(startPoint, value); } public void addAll(Counter<? extends Number> counter) { for (Entry<? extends Number, Double> entry : counter.entrySet()) { add(entry.getKey().doubleValue(), entry.getValue()); } } @Override public String toString() { StringBuilder sb = new StringBuilder("["); NumberFormat f = NumberFormat.getInstance(); f.setMaximumFractionDigits(5); Number previous = null; for (Number element : startPoints) { if (previous != null) { Number rangeEnd = null; if (intKeys) { int num = element.intValue() - 1; int prev = previous.intValue(); if (num != prev) rangeEnd = num; } else rangeEnd = element; sb.append(f.format(previous) + (rangeEnd == null ? "" : "-" + f.format(rangeEnd))); sb.append(" : "); sb.append(f.format(data.getCount(element))); sb.append(", "); } previous = element; } sb.append(f.format(previous) + "-"); sb.append(" : "); sb.append(f.format(data.getCount(previous))); sb.append("]"); return sb.toString(); } }