import java.util.Scanner;
public class Histogram{
private static final int SENTINAL = -999; // sentinal value to signal endo of input
private static final int MAX_NUMBERS = 20; // maximum number of numbers to input
private static final double UPPER_BOUND = 100.0; // largest numbers accepted as data
private static final double LOWER_BOUND = 0.0; // smallest numbers accepted as adata
private static final int NUM_BINS = 10; // number of bins in range [0..100]
private static int NUMS = 0;
private static final int BIN_SIZE = 100/NUM_BINS; // size of each bin
/*
* Method to show an example of using StringBuilder.
*
* You will also notice that this method is called from the
* main function.
*
*/
public static String getHeaderAsString( String me ) {
// Create an instance of the StringBuilder class
// which allows us to create an object of
// a series of strings that can then be converted
// into one large string via the toString method.
//
StringBuilder sb=new StringBuilder();
sb.append( System.getProperty("line.separator") );
sb.append( "Welcome to the Histogram Program " + me + "!" );
me = getFirstName(me);
sb.append( System.getProperty("line.separator") );
sb.append( System.getProperty("line.separator") );
sb.append( "This program will print out a histogram of the numbers" );
sb.append( System.getProperty("line.separator") );
sb.append( "input by you " + getFirstName(me) + "." );
sb.append( System.getProperty("line.separator") );
sb.append( System.getProperty("line.separator") );
sb.append( "Please enter up to " + MAX_NUMBERS + " doubles or " + SENTINAL + " to stop input!" );
sb.append( System.getProperty("line.separator") );
return sb.toString();
}
/*
* Method to return the first name of the user in case
* the full name was entered.
*/
public static String getFirstName(String name ) {
// Note that add the " " to string to be sure
// there is something to split
return (name+" ").split(" ")[0];
}
/*
* local main test driver
*
*/
public static void main(String[] args) {
// Connect to the keyboard as the input stream
Scanner userInput = new Scanner( System.in );
System.out.print( "And who am I working with today? " );
String user = userInput.nextLine();
String heading = getHeaderAsString( user );
// Print out welcome message
System.out.println( heading );
// Call the method which prompts the user
// to input the numbers that will be used
// to build the histogram.
double[] numbers = inputNumbers( userInput );
// Call the method to reate the array histogram
int[] histogram = calculateHistogram( numbers );
// Print the historgram
System.out.println( toString( histogram ) );
}
public static int[] calculateHistogram(double []numbers){
int histogram[] = new int[NUM_BINS];
//looping through numbers array
for (int i = 0; i < NUMS; i++) {
//incrementing the appropriate bins counter based on value
if (numbers[i]<=LOWER_BOUND+BIN_SIZE&& LOWER_BOUND+BIN_SIZE<UPPER_BOUND) {
histogram[NUM_BINS-NUM_BINS]+=1;
}else if (numbers[i]<=LOWER_BOUND+(2*BIN_SIZE)&& LOWER_BOUND+(2*BIN_SIZE)<=UPPER_BOUND){
histogram[NUM_BINS-(NUM_BINS-1)]+=1;
}else if (numbers[i]<=LOWER_BOUND+(3*BIN_SIZE)&& LOWER_BOUND+(3*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-2)]+=1;
}else if (numbers[i]<=LOWER_BOUND+(4*BIN_SIZE)&& LOWER_BOUND+(4*BIN_SIZE)<=UPPER_BOUND){
histogram[NUM_BINS-(NUM_BINS-3)]+=1;
}else if (numbers[i]<=LOWER_BOUND+(5*BIN_SIZE)&& LOWER_BOUND+(5*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-4)]+=1;
} else if (numbers[i]<=LOWER_BOUND+(6*BIN_SIZE)&& LOWER_BOUND+(6*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-5)]+=1;
} else if (numbers[i]<=LOWER_BOUND+(7*BIN_SIZE)&& LOWER_BOUND+(7*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-6)]+=1;
} else if (numbers[i]<=LOWER_BOUND+(8*BIN_SIZE)&& LOWER_BOUND+(8*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-7)]+=1;
} else if (numbers[i]<=LOWER_BOUND+(9*BIN_SIZE)&& LOWER_BOUND+(9*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-8)]+=1;
} else if (numbers[i]<=LOWER_BOUND+(10*BIN_SIZE)&& LOWER_BOUND+(10*BIN_SIZE)<=UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-9)]+=1;
}
}
return histogram;
}
public static int findBin( double num ) {
int result=(int) (num/10);
return result;
}
public static String toString( int [] histogram ) {
StringBuilder sb=new StringBuilder();
int BIN_SIZE=(int) ((UPPER_BOUND-LOWER_BOUND)/NUM_BINS);
int temp=(int) ((UPPER_BOUND-LOWER_BOUND)/NUM_BINS);
int tem=(int) LOWER_BOUND;
for(int i=0;i<histogram.length;i++) {
sb.append("["+tem+".."+BIN_SIZE+"]: "+" ");
for(int j=0;j<histogram[i];j++) {
sb.append('*');
}
sb.append( System.getProperty("line.separator") );
tem=BIN_SIZE;
BIN_SIZE+=temp;
}
return sb.toString();
}
public static boolean validInput( double num ) {
if(num<LOWER_BOUND|| num>UPPER_BOUND) {
return false;
}
return true;
}
public static double[] inputNumbers( Scanner scan ) {
double[] input=new double[MAX_NUMBERS];
while(NUMS<MAX_NUMBERS) {
double num=scan.nextDouble();
if(num!=SENTINAL) {
if(validInput(num)) {
input[NUMS]=num;
NUMS++;
}
}
else {
break;
}
}
return input;
}
}
如何改写calculatehistogram方法,从而让他不那么冗杂,连续用这么多if感觉不好,或者更改一下tostring函数
这是程序的功能图片