Création d'un histogramme dans Java


J'ai créé un histogramme avec le code suivant:

import java.util.*; 

public class Murray_A03Q3 {
    public static void main (String [] args){

        int num = 1;
        int[] nums = new int[10];  

        List<Integer> list = new ArrayList<Integer>();

        Scanner scan = new Scanner(System.in);


        while(num != 0){
           System.out.print("Enter a value to plot: ");
           num = scan.nextInt();
           System.out.println();
           if(num != 0)
              list.add(num);
        }


        for (int a = 0; a < list.size(); a++){
            nums[(list.get(a)-1) / 10]++;
        }

        for (int count = 0; count < 10; count++){
           System.out.print((count*1+1) + (count == 1 ? " ": " ") + "| \t");

           for(int h = 0; h < nums[count]; h++)
              System.out.print("#");

           System.out.println();
        }

    } // end of main

} // end of class Murray

Avec la sortie étant:

1 |     ######
2 |     
3 |     
4 |     
5 |     
6 |     #
7 |     
8 |     
9 |     #
10 | 

Mais j'en ai besoin pour imprimer les valeurs de l'entrée des utilisateurs de 1-10 et non 1-100 comme il semble être imprimé (la sortie ci-dessus utilisait deux valeurs en dehors de dix, c'est pourquoi l'une a été imprimée à 6 et 9). J'ai parcouru le code et essayé de le manipuler de différentes manières pour obtenir réellement ce que je voulais, mais je ne peux pas le comprendre. Ma question est, ce qui doit réellement être changé en obtenez les valeurs entre 1-10?

Merci pour votre aide!

Author: mur7ay, 2015-07-19

2 answers

Vous devez le limiter afin qu'ils ne puissent entrer que 1-10. Dans votre tableau nums, je viens de stocker le nombre d'occurrences de ce numéro d'index. Ensuite, lors de l'impression, imprimez simplement l'index+1 et la boucle interne fait les #pour vous.

import java.util.*;

public class Murray_A03Q3{
   public static void main (String [] args){

      int num = 1;
      int[] nums = new int[10];  

      List<Integer> list = new ArrayList<Integer>();

      Scanner scan = new Scanner(System.in);

      while(num != 0){
         System.out.print("Enter a value to plot: ");
         num = scan.nextInt();
         System.out.println();
         if(num > 0 && num <= 10)
            list.add(num);
         if(num > 10 || num < 0)
                System.out.println("Please enter a number 1-10");
      }

      for (int a = 0; a < list.size(); a++){
         nums[a] = Collections.frequency(list, a);
      }

      for (int count = 0; count < 10; count++){
         System.out.print((count+1) + "\t|");

         for(int h = 0; h < nums[count]; h++)
            System.out.print("#");

         System.out.println();
      }
   } // end of main
} // end of class Murray

J'ai également déplacé la ligne devant l'onglet pour le rendre plus uniforme. C'était une entrée pour 1, 2, 3. Il affichait tous les 3 #sur la ligne 1.

1   |#
2   |#
3   |#
4   |#
5   |
6   |
7   |
8   |
9   |
10  |
 1
Author: MC10, 2015-07-20 14:07:12

Eh bien, votre boucle est fausse lorsque vous ajoutez à nums si vous voulez exclure des choses en dehors de 10. Changer

for (int a = 0; a < list.size(); a++){
    nums[(list.get(a)-1) / 10]++;
}

À

for (int a = 0; a < list.size(); a++) {
    if (list.get(a)-1 < 10) {
        nums[list.get(a)]++;
    }
}
 0
Author: David M, 2015-07-19 01:17:22