java方法的修改与提升

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函数
这是程序的功能图片

img

我回复的不行么?

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

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^