HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Vertical Histogram

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
histogramverticalstackoverflow

Problem

I've been been working on a vertical histogram that prints an asterisk in place of a number in a certain range (say 1-10... and so on). My code is working as required.

Is there a better, simpler or more efficient way of doing it? If so, would you mind explaining or showing me better code if you have it handy?

```
import java.util.Scanner;

public class VerticalHistogram{
public static void main(String args[]){
int ranges[] = generateRandomNumbers(amountOfRandomNumbersToGenerate());
printVerticalHistogram(largestValueInArray(ranges), ranges);
}
public static int amountOfRandomNumbersToGenerate(){
Scanner input = new Scanner(System.in);
System.out.print("Enter amount of random numbers to generate: ");
return Integer.parseInt(input.nextLine());
}
public static int[] generateRandomNumbers(int amount){
int ranges[] = new int[10];
for(int i = 0; i largest) largest = ranges[i];
return largest;
}
public static void printVerticalHistogram(int rows, int asterisks[]){

System.out.printf(" %-7d%-7d%-7d%-7d%-7d%-7d%-7d%-7d%-7d%d",asterisks[0],asterisks[1],
asterisks[2],asterisks[3],asterisks[4],asterisks[5],asterisks[6],asterisks[7],asterisks[8],asterisks[9]);
System.out.println();
while(rows > 0){
for(int i = 0; i < asterisks.length; i++){
if(i == 0){
if(asterisks[i] < rows) System.out.printf(" %-7s"," ");
else System.out.printf(" %-7s","*");
}
else{
if(asterisks[i] < rows) System.out.printf("%-7s"," ");
else System.out.printf("%-7s","*");
}
}
System.out.println();
rows--;
}
System.out.printf("%-6s%-7s%-7s%-7s%-7s%-7s%-7s%-7s%-7s%s","1-10","11-20","21-30",
"31-40","41-50","51-60","61-70","71-80","81-90","91-100");

Solution

You can simplify the tedious else-ifs in generateRandomNumbers like this:

public static int[] generateRandomNumbers(int amount) {
    int ranges[] = new int[10];
    for (int i = 0; i < amount; i++) {
        int num = (int)(Math.random() * 100) + 1;
        ranges[Math.min(9, num / 10)]++;
    }
    return ranges;
}


Getting random numbers with Math.random is a bit tedious.
A more ergonomic way is using Random.nextInt, for example:

Random random = new Random();
    // ...
    int num = random.nextInt(100) + 1;


Also, it is recommended to use braces with even single line statements, for example:

public static int largestValueInArray(int ranges[]) {
    int largest = ranges[0];
    for (int i = 1; i  largest) {
            largest = ranges[i];
        }
    }
    return largest;
}

Code Snippets

public static int[] generateRandomNumbers(int amount) {
    int ranges[] = new int[10];
    for (int i = 0; i < amount; i++) {
        int num = (int)(Math.random() * 100) + 1;
        ranges[Math.min(9, num / 10)]++;
    }
    return ranges;
}
Random random = new Random();
    // ...
    int num = random.nextInt(100) + 1;
public static int largestValueInArray(int ranges[]) {
    int largest = ranges[0];
    for (int i = 1; i < ranges.length; i++) {
        if (ranges[i] > largest) {
            largest = ranges[i];
        }
    }
    return largest;
}

Context

StackExchange Code Review Q#77743, answer score: 5

Revisions (0)

No revisions yet.