patternjavaMinor
Vertical Histogram
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");
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
Getting random numbers with
A more ergonomic way is using
Also, it is recommended to use braces with even single line statements, for example:
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.