weixin_51573847 2022-10-03 16:16 采纳率: 77.3%
浏览 27
已结题

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

img

  • 写回答

5条回答 默认 最新

  • 快乐鹦鹉 2022-10-03 16:18
    关注

    我回复的不行么?

    for (int i = 0; i < NUMS; i++) {
    if(numbers[i] == 0)
    histogram[0]++;
    else
    histogram[(int)((numbers[i]-1)/10)]++;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 创建了问题 10月3日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效