# a more efficent way?

• 09-15-2011, 06:44 AM
droidus
a more efficent way?
I am trying to find a more efficent/proper way to solve this problem:

Design and implement an application that creates a histogram that allows you to visually inspect the frequency distribution of a set of values. The program should read in an arbitrary number of integers that are in the range 1 to 100 inclusive; then produce a chart similar to the one below that indicates how many input values fell in the range 1 to 10, 11 to 20, and so on. Print one asterisk for each value entered.

****1 - 10 | *****
***11 - 20 | ****
***21 - 30 | *********
***31 - 40 | **
***41 - 50 | **************
***51 - 60 | ******
***61 - 70 | ****
***71 - 80 | ********
***81 - 90 | *
**91 - 100 | ***

and here is what i have. i am using two ways to solve the problem. by the way, is there any way you can integrate range in with the switch statement? (and maybe you can help me figure out how to get the second method of solving this, to work! =D )

Code:

```Scanner scan = new Scanner (System.in); int[] numbersArray; int[] histogram = new int[10]; String[] groups = {"1 - 10 | ", "11 - 20 | ", "21 - 30 | ", "31 - 40 | ", "41 - 50 | ", "51 - 60 | ", "61 - 70 | ", "71 - 80 | ", "81 - 90 | ", "91 - 100 | "}; String msg; System.out.println("Please enter lines of text (or 'done'):"); do {         msg = scan.nextLine();         if (!msg.equals("done")) {                 int number = Integer.parseInt(msg); // here is one way to solve, with lots of code built inside of the main method                 if (number > -1 && number < 101)                 {                         if(number <= 10) {         histogram[0] += 1; } if(number <= 20 && number >=11) {         histogram[1] += 1; } if(number <= 30 && number >=21) {         histogram[2] += 1; } if(number <= 40 && number >=31) {         histogram[3] += 1; } if(number <= 50 && number >= 41) {         histogram[4] += 1; } if(number <= 51 && number >=60) {         histogram[5] += 1; } if(number <= 70 && number >=61) {         histogram[6] += 1; } if(number <= 80 && number >=71) {         histogram[7] += 1; } if(number <= 90 && number >=81) {         histogram[8] += 1; } if(number <= 100 && number >=91) {         histogram[9] += 1; }                 }                         }         if (msg.equalsIgnoreCase("done")) {                 break;         }         }         while (true); for (int i = 0; i<histogram.length; i++) {         System.out.print(groups[i]);                 int count = histogram[i];                 for(int k = 0; k < count; k++)         {                 System.out.print("*");         }         System.out.print("\n"); } // here is another way to solve this, with a method int number = 6; numbersArray = valueRange(number, histogram); System.out.println("\n"); for (int i=0; i<numbersArray.length; i++) {         System.out.println(numbersArray[i]); } } public static int[] valueRange (int number, int[] histogram) { for (int i=0; i<histogram.length; i++) { if(number <= 10) {         histogram[0] += 1; } if(number <= 20 && number >=11) {         histogram[1] += 1; } if(number <= 30 && number >=21) {         histogram[2] += 1; } if(number <= 40 && number >=31) {         histogram[3] += 1; } if(number <= 50 && number >= 41) {         histogram[4] += 1; } if(number <= 51 && number >=60) {         histogram[5] += 1; } if(number <= 70 && number >=61) {         histogram[6] += 1; } if(number <= 80 && number >=71) {         histogram[7] += 1; } if(number <= 90 && number >=81) {         histogram[8] += 1; } if(number <= 100 && number >=91) {         histogram[9] += 1; } } return histogram; }```
• 09-15-2011, 07:19 AM
DarrylBurke
Re: a more efficent way?
Quote:

is there any way you can integrate range in with the switch statement?
Not in general, but for your requirement you could
Code:

`switch ((n -1) / 10)`
Also, +=1 is equivalent to the post increment operator ++
db