code: package edu.berkeley.nlp.util;
  
  import java.text.NumberFormat;
  import java.util.Map.Entry;
  import java.util.SortedSet;
  
  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();
  	}
  }
  