0

Trying to make a histogram, but the loop I'm trying to use for it is giving me a Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 14 error. I'm trying to get something along the lines of:

*       *               
*       *       *       *       
*       *   *   *       *   *   
*       *   *   *       *   *   
*       *   *   *   *   *   *   
*       *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
*   *   *   *   *   *   *   *   *   *
-   -   -   -   -   -   -   -   -   -
0   1   2   3   4   5   6   7   8   9

And this is what I have so far:

public static void VerticalHist()
   {
      int max = 0; // initialize max

      int[] count = new int[10]; // make array to find max

      for (int i = 0; i < 100; i++)
      {
         int rand = (int)(Math.random() * ((9 - 0) + 1)); // generate random values

         count[rand]++;
      }

      for (int x : count) // find max 
      {
         if (x > max)
            max = x;
      }

      // System.out.println(max);
      String[][] nums2 = new String[max][10]; // create 2d array for histogram

      for (int x = max; x > 0; x--)
      {
         System.out.println();
         for (int i = 0; i < nums2[x].length; i++)
         {
            if (count[i] > 0)
               nums2[x][i] = "*";
         }
      }

      for (int i = 0; i < max; i++) // print 2d array
      {
         System.out.println();
         for (String n: nums2[i])
         {
            System.out.print(n);
         }
      }

   }

My loop for inserting the * is giving me the error.

for (int x = max; x > 0; x--)
      {
         System.out.println();
         for (int i = 0; i < nums2[x].length; i++)
         {
            if (count[i] > 0)
               nums2[x][i] = "*";
               count[i]--;
            else
               nums2[x][i] = "";
         }
      }

I'm trying to take each row, check each index to see if there needs to be an asterisk, (if so, put an asterisk, if not put a blank space) and do so for each row in the 2d array.

2 Answers 2

1

I think the problem might be in the for loop definition,

for (int x = max; x > 0; x--)

Can you try changing it to

for (int x = max-1; x >= 0; x--)

The reason is, since you define an array of size max and index starts from zero max is actually outside the array

Sign up to request clarification or add additional context in comments.

2 Comments

for (int x = max-1; x >= 0; x--) x>=0 should be kept as it was since for the value 0 we cant go to 0-- which is -1 index
That fixed it! I completely forgot that arrays don't have an index equal to their length. I've been stuck on this for hours, thank you!
0

The first thing is that this line

for (int x = max; x > 0; x--)

should be

for (int x = max-1; x >= 0; x--)

I would then change the logic to decide whether to add a "*" or a " " to this:

if (count[i] > x)
   nums2[x][i] = "*";
else
   nums2[x][i] = " ";

Note that this needs to be a space, not an empty string, otherwise your rows will be compressed.

With these changes you get output like this:

**********
**********
**********
**********
**********
**********
**********
** *******
 * *** ***
 * * * ***
 * *   ** 
 * *    * 
        * 

Which is obviously upside down. You need to change this line:

for (int i = 0; i < max; i++) // print 2d array

to this

for (int i = max-1; i >= 0; i--) // print 2d array

Which produces:

 *  **    
 *  **    
 *  **    
 *  ** *  
 *  ** *  
 * *** * *
 * *** * *
 * *** * *
 ***** ***
****** ***
****** ***
****** ***
**********
**********
**********

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.