2016-10-13 9 views
0

You will develop a program to count the number of times each number in the range is generated. Your program will generate 100 numbers in the range [0, 9] and you will print a histogram similar to the histogram shown below.方法/乱数の印刷ヒストグラム

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

To print the histogram shown above, your program must record the number of times each number is generated.

私はNUMを渡し、印刷方法にカウントして、アスタリスクとしてそれを印刷するにはswitch文を通してそれを渡すようにしようとしています。それは私にエラーを与えている。助言?

ここで私が取得していますエラーです:

ここ

required: int,int found: no arguments reason: actual and formal argument lists differ in length /tmp/java_9JsuaS/RandomSrv.java:55: error: method print in class RandomSrv cannot be applied to given types; System.out.print("9 " + this.print()); ^

import java.util.Random; 

public class RandomSrv 
{ 

    public void genNums(int total) 
    { 

     for(int counter = 0; counter < total; counter++) //counter for the random gen nums// 

     { 
      int UPPER_BOUND = 10;//max number it will go to: 9 

      int count0 = 0; //stores counter// 

      int count1 = 0; 
      int count2 = 0; 

      int count3 = 0; 

      int count4 = 0; 

      int count5 = 0; 

      int count6 = 0; 

      int count7 = 0; 

      int count8 = 0; 

      int count9 = 0; 

      int count = 0; 

      Random randObj = new Random(); //creating randoms object// 
      int num = randObj.nextInt(UPPER_BOUND);//num ranges 1-10// 
      print(num, count); 
      switch (num) //counts it into catagories// 
       { 
       case 0: count = count0++; 
        System.out.print("0 " + this.print()); 
        break; 
       case 1: count = count1++; 
        System.out.print("1 " + this.print()); 
        break; 
       case 2: count = count2++; 
        System.out.print("2 " + this.print()); 
        break; 
       case 3: count = count3++; 
        System.out.print("3 " + this.print()); 
        break; 
       case 4: count = count4++; 
        System.out.print("4 " + this.print()); 
        break; 
       case 5: count = count5++; 
        System.out.print("5 " + this.print()); 
        break; 
       case 6: count = count6++; 
        System.out.print("6 " + this.print()); 
        break; 
       case 7: count = count7++; 
        System.out.print("7 " + this.print()); 
        break; 
       case 8: count = count8++; 
        System.out.print("8 " + this.print()); 
        break; 
       case 9: count = count9++; 
        System.out.print("9 " + this.print()); 
        break; 
       } 

     } 
    } 
    public void print(int num, int count) //converting them to astericks// 
    { 
    for(int x = 0; x < count; x++) 
     { 
     System.out.println("*"); 
     }  
    } 
} 
+1

コードが長すぎると、所望の問題にcomplicaedあります。私はint [10](0から9まで)のようなArrayを考えてみることをお勧めします。配列の各位置はその値を参照します:array [i ++] 1。最後の印刷は、その配列を実行することによって行われます。 – Rotem

+0

数字の生成方法は教えていません。 [毎回4回生成する](https://xkcd.com/221/)して、100個のアスタリスクを連続して印刷できます。 – jsheeran

答えて

1

はそれを行うための一つの方法は次のとおりです。ここ

int[] counts = new int[10]; // this array will hold the count for each number (0-9) 
Random rand = new Random(); // the Random object 

/* Loop 100 times getting a random number each time, and add to the corresponding count */ 
for(int i=0; i<100; i++) 
{ 
    switch(rand.nextInt(10)) 
    { 
     case 0: counts[0]++; break; 
     case 1: counts[1]++; break; 
     case 2: counts[2]++; break; 
     case 3: counts[3]++; break; 
     case 4: counts[4]++; break; 
     case 5: counts[5]++; break; 
     case 6: counts[6]++; break; 
     case 7: counts[7]++; break; 
     case 8: counts[8]++; break; 
     case 9: counts[9]++; break; 
     default: break; 
    } 
} 

/* Loop 10 times printing the asterisks for each count */ 
for(int i=0; i<10; i++) 
{ 
    System.out.print(i + " "); 
    for(int j=0; j<counts[i]; j++) 
     System.out.print("*"); 
    System.out.println(); 
} 

は、ファイル名を指定して実行、それを(オンラインコンパイラ):http://rextester.com/UKSB96871

+2

switchの代わりに 'counts [rand.nextInt(10)] ++'を書くことができます(また、インデックスをvarとして抽出することもできます)。 –

0

私はこれが簡単な方法だと思う:

import java.util.Random; 

public class RandomSrv { 
    private final int UPPER_BOUND;// max number it will go to 
    private final int TOTAL; 
    private final int[] numbers; 
    private final int[] counter; 

    public RandomSrv(int upperBound, int total) { 
     this.UPPER_BOUND = upperBound; 
     this.TOTAL = total; 
     this.numbers = new int[this.TOTAL]; 
     this.counter = new int[this.UPPER_BOUND]; 
     this.genNums(); 
    } 

    private void genNums() { 
     Random randObj = new Random(); // creating random objects 
     for (int counter = 0; counter < TOTAL; counter++) { 
      // counter for the 
      // random generate numbers 
      int num = randObj.nextInt(UPPER_BOUND); 
      this.numbers[counter] = num; 
      this.counter[num]++; 
     } 
    } 

    private void print(int count) // converting them to asterisks 
    { 
     System.out.print(String.format("%d: ", count)); 
     for (int x = 0; x < counter[count]; x++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 
    } 

    public void printAll() { 
     for (int count = 0; count < this.UPPER_BOUND; count++) { 
      this.print(count); 
     } 
    } 

    public static void main(String[] commandArguments) { 
     int upperBound = 10; 
     int total = 100; 
     new RandomSrv(upperBound, total).printAll(); 
    } 
} 
0

別の解決策

Map<Integer, String> groups = Stream.generate(() -> rand.nextInt(10)) 
            .limit(100) 
            .collect(Collectors.groupingBy(Function.identity(), 
                    Collectors.mapping(e -> "*", 
                         Collectors.joining()))); 

groups.forEach((number, hist) -> System.out.println(number + " " + hist)); 
+1

間違いなく初心者のための解決策... –