package org.jzy3d.maths;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Histogram {
    protected Range[] ranges ;
    protected Map data;
    
    public Histogram(float min, float max, int bins){
        initBins(min, max, bins);
    }

    private void initBins(float min, float max, int bins) {
        data = new HashMap(bins);
        ranges = new Range[bins];
        
        
        float step = (max-min)/bins;
        float rmin = min;
        for (int i = 0; i < bins - 1; i++) {
            ranges[i] = new Range(rmin, rmin + step);
            data.put(ranges[i], 0);
            rmin = rmin + step;
        }
        ranges[bins-1] = new Range(rmin, max);
        data.put(ranges[bins-1], 0);
    }

    public void add(List values){
        for(float v : values){
            add(v);
        }
    }
    
    public void add(float value){
        for(Entry e: data.entrySet()){
            Range r = e.getKey();
            if(r.isIn(value, true, true)){
                e.setValue(e.getValue()+1);
                return;
            }
        }
        illegalValueException(value);
    }

    private void illegalValueException(float value) {
        StringBuilder sb = new StringBuilder();
        String m = "value could not be added to any pre-configured bin. "
                + "Are you adding a value out of the min-max range you used to build " 
                + Histogram.class.getSimpleName() + "?";
        sb.append(m + "\n");
        sb.append("min:" + ranges[0].getMin() + "\n");
        sb.append("max:" + ranges[ranges.length-1].getMax() + "\n");
        sb.append("value:" + value + "\n");
        throw new IllegalArgumentException(sb.toString());
    }
    
    public Range[] ranges(){
        return ranges;
    }

    public int getCount(int bin) {
        return data.get(ranges[bin]);
    }
    
    public void setCount(int bin, int value) {
        data.put(ranges[bin], value);
    }

    public void console() {
        for (int i = 0; i < ranges.length; i++) {
            System.out.println(ranges[i] + " : " + data.get(ranges[0]));
        }
    }

    
    public int computeMaxCount() {
        int max = Integer.MIN_VALUE;
        for(Entry e : data.entrySet()){
            int v = e.getValue();
            if(v>max)
                max = v;
        }
        return max;
    }
}

 

Ads help maintain this website.