In Java, Extensible Histogram of Array of Integers

import java.util.Scanner;

public class Histogram {

	private int min;
	private int max;
	private int[]stats;

	public Histogram(int m, int n){
		assign(m, n, Math.min(m, n));
	}

	private void assign(int mn , int mx, int mi){
                min = Math.min(mn, mi);
                max = Math.max(mx, mi);
                stats = new int[max-min+1];
	}

	public boolean add(int i){
		boolean done = false;
		if(min <= i && max >= i){
			i -= min;
			stats[i] ++;
			done = true;
		}
		return done;
	}

	public void addOutOfRange(int i){
		if(add(i)) return;
		int[]tmp = stats;
		int j = min;
		assign(min, max, i);
		System.arraycopy(tmp, 0, stats, j, tmp.length);
		add(i);
	}

	public String toString(){
		StringBuilder sb = new StringBuilder();
		for(int i = 0, j; stats.length > i; i++){
			if(0 != i)sb.append(' ');
			sb.append(min+i).append(':');
			for(j = 1; stats[i] >= j; j++) sb.append('*');
		}
		return sb.toString();
	}

	public static void main(String[]args){
		Scanner input = new Scanner(System.in);
		System.out.print("Enter lower bounds for histogram: ");
		int low = new Integer(input.nextLine());
		System.out.print("Enter upper bounds for histogram: ");
		int high = new Integer(input.nextLine());
		Histogram histo = new Histogram(low, high);
		int num;
		do{
			System.out.print("Enter data: ");
			num = new Integer(input.nextLine());
			if(!histo.add(num)){
				System.out.println("Warn: out of range!");
				break;
			}
		}while(true);
		System.out.println(histo);
	}
}

Comments

Popular posts from this blog