2017-02-26 1 views
0

Ich versuche, ein Java-Programm zu schreiben, das ein Histogramm von Sternchen für jedes Vorkommen eines Werts in einem Array generiert.Schleifenstruktur für Histogramm

Wenn die Elemente 0,1,2,3,4,5,6,7,8,9 lauten, sollte der Ausgang für jedes Auftreten einen Stern haben. Zum Beispiel

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

jedoch meine Ausgabe ist

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

Der folgende Code unter meiner eigenen ist.

public static void drawHistogram(double[] array) { 

    String count = ""; 

    for (int i = 0; i < array.length; i++) { 
     if (array[i] >= 0 && array[i] < 1) { 
      count += "*"; 
     } else if (array[i] >= 1 && array[i] < 2) { 
      count += "*"; 
     } else if (array[i] >= 2 && array[i] < 3) { 
      count += "*"; 
     } else if (array[i] >= 3 && array[i] < 4) { 
      count += "*"; 
     } else if (array[i] >= 4 && array[i] < 5) { 
      count += "*"; 
     } else if (array[i] >= 5 && array[i] < 6) { 
      count += "*"; 
     } else if (array[i] >= 6 && array[i] < 7) { 
      count += "*"; 
     } else if (array[i] >= 2 && array[i] < 8) { 
      count += "*"; 
     } else if (array[i] >= 2 && array[i] < 9) { 
      count += "*"; 
     } else if (array[i] >= 9 && array[i] < 10) { 
      count += "*"; 
     } else if (array[i] >= 10 && array[i] < 11) { 
      count += "*"; 
     } 
    } 
    for (int j = 0; j <= 10; j++) { 
     System.out.print(j + count); 
     count = ""; 
     System.out.println(); 
    } 
} 

Wie kann ich dieses Problem beheben?

+0

Sieht aus wie du bist nur eine Zählung zu halten. Wie erwarten Sie, mehrere Werte mit nur einer Zählung zu verfolgen? –

+1

Ich würde vorschlagen, ein neues Array von Strings namens countStrings [] hinzufügen, wo Element 0 die Anzahl der Werte von weniger als 1 verfolgt, Element 1 verfolgt die Anzahl der Werte von weniger als 2 und so weiter. Im Code jeder 'if'-Bedingung würden Sie dann ein Sternchen an das entsprechende Element im Array anhängen. Zum Beispiel, wenn 'array [i]> = 3 && array [i] <4', würden Sie die Anweisung 'countStrings [3] + =" * ";' –

+0

ausführen. Sie könnten den Code noch weiter vereinfachen, indem Sie '' verwenden Math.floor' -Funktion und loswerden aller if-then-else-Anweisungen. –

Antwort

0

Diese Lösung verwendet (int) Math.floor(array[i]), um die Klammer auszuwählen, in die der doppelte Wert eingefügt werden soll, wodurch die mehreren if-then-else-Anweisungen entfernt werden. Ich habe auch StringBuilder anstelle von String verwendet, um die wiederholte Verkettung von Sternchen ein wenig effizienter zu machen.

public static void drawHistogram(double[] array) { 

    StringBuilder histoGram[] = new StringBuilder[11]; 
    for (int i = 0; i < histoGram.length; i++) { 
     histoGram[i] = new StringBuilder(); 
    } 

    for (int i = 0; i < array.length; i++) { 
     int bracket = (int) Math.floor(array[i]); 
     if (bracket >= 0 && bracket < histoGram.length) { 
      histoGram[bracket].append("*"); 
     } 
    } 
    for (int j = 0; j < 11; j++) { 
     System.out.format("%02d: %s\n", j, histoGram[j].toString()); 
    } 
} 

-Test main Methode:

public static void main(String args[]) { 
    double[] testValues = new double[100]; 
    for (int i = 0; i < 100; i++) { 
     testValues[i] = Math.random() * 11.0; 
    } 
    drawHistogram(testValues); 
} 

Beispielausgabe:

00: ******* 
01: ******** 
02: *********** 
03: ************ 
04: ******** 
05: ********** 
06: ******* 
07: ******** 
08: ********** 
09: ************ 
10: ******* 
0
public static void drawHistogram(double[] array) { 

     String count[] = new String[array.length]; 

     for (int i = 0; i < array.length; i++) { 
      if (array[i] >= 0 && array[i] < 1) { 
       count[0] = "*"; 
      } else if (array[i] >= 1 && array[i] < 2) { 
       count[1] = "*"; 
      } else if (array[i] >= 2 && array[i] < 3) { 
       count[2] = "*"; 
      } else if (array[i] >= 3 && array[i] < 4) { 
       count[3] = "*"; 
      } else if (array[i] >= 4 && array[i] < 5) { 
       count[4] = "*"; 
      } else if (array[i] >= 5 && array[i] < 6) { 
       count[5] = "*"; 
      } else if (array[i] >= 6 && array[i] < 7) { 
       count[6] = "*"; 
      } else if (array[i] >= 2 && array[i] < 8) { 
       count[7] = "*"; 
      } else if (array[i] >= 2 && array[i] < 9) { 
       count[8] = "*"; 
      } else if (array[i] >= 9 && array[i] < 10) { 
       count[9] = "*"; 
      } else if (array[i] >= 10 && array[i] < 11) { 
       count[10] = "*"; 
      } 
     } 
     for (int j = 0; j <= 10; j++) { 
      System.out.print(j + count[j]); 
      System.out.println(); 
     } 
} 
+0

Danke für Ihre Antwort – nammrick

0

Es scheint, dass Sie nur eine einzelne Variable verwenden, um das Auftreten von Zahlen in dieser Methode zu zählen. Dies führt dazu, dass das Programm anzeigt, dass 0 neun Vorkommen hat und der Rest der Zahlen 0 Vorkommen hat. Ich stimme dem Benutzer David Choweller in den Kommentaren zu, der vorschlug, dass Sie ein Array verwenden könnten, um dieses Problem zu lösen. Eine andere Lösung könnte jedoch eine HashMap sein, in der Sie die Nummer als Schlüssel und die Zeichenfolge als Wert speichern. Dann können Sie die Schleife durch die Zahlen am Ende verwenden, wie Sie es gerade tun, und die zugehörigen Werte ausdrucken.

+0

Ich wollte nur feststellen, dass die Array-Lösung schneller und effizienter sein könnte, aber ich wollte die Lösung teilen, die mir zuerst in den Sinn kam, als ich dieses Problem sah. – UnknowableIneffable

+0

Danke für die Rückmeldung @UnknownableInffible – nammrick