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_SIZE1;
}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"["+tem+".."+BIN_SIZE+"]: "+" ");
for(int j=0;j'*');
}
sb.append( System.getProperty("line.separator") );
tem=BIN_SIZE;
BIN_SIZE+=temp;
}
return sb.toString();
}
public static boolean validInput( double num ) {
if(numUPPER_BOUND) {
return false;
}
return true;
}
public static double[] inputNumbers( Scanner scan ) {
double[] input=new double[MAX_NUMBERS];
while(NUMSdouble num=scan.nextDouble();
if(num!=SENTINAL) {
if(validInput(num)) {
input[NUMS]=num;
NUMS++;
}
}
else {
break;
}
}
return input;
}
}
如何改写calculatehistogram方法,从而让他不那么冗杂,连续用这么多if感觉不好,或者更改一下tostring函数
这是程序的功能图片
我回复的不行么?
for (int i = 0; i < NUMS; i++) {
if(numbers[i] == 0)
histogram[0]++;
else
histogram[(int)((numbers[i]-1)/10)]++;
for (int i = 0; i < NUMS; i++) {
if (numbers[i]<=LOWER_BOUND++((i+1)*BIN_SIZE)&& LOWER_BOUND+((i+1)*BIN_SIZE)<UPPER_BOUND) {
histogram[NUM_BINS-(NUM_BINS-i)]+=1;
}
}
换个思路啦,用对象的方式,完整代码贴你上个帖子啦
static class Category {
private Double begin;
private boolean beginInclude;
private Double end;
private List<Double> data;
public static List<Category> build() {
return IntStream.rangeClosed(0, 100 / 10 - 1).mapToObj(item -> new Category(item * 10d, item == 0 ? true : false, (item + 1) * 10d)).collect(Collectors.toList());
}
public boolean add(Double param) {
boolean result = false;
if (begin == param && beginInclude) {
result = true;
data.add(param);
} else if (begin < param && param <= end) {
result = true;
data.add(param);
}
return result;
}
@Override
public String toString() {
return new StringBuilder().append(this.beginInclude ? "[" : "(").append(begin).append("...").append(end).append("]:").append(data.isEmpty() ? "" : IntStream.rangeClosed(0, data.size() - 1).mapToObj(item -> "*").collect(Collectors.joining())).toString();
}
public Category(Double begin, boolean beginInclude, Double end) {
this.begin = begin;
this.beginInclude = beginInclude;
this.end = end;
this.data = new ArrayList<>();
}
}
111
不知道你这个问题是否已经解决, 如果还没有解决的话: