eine Art Histogramm mithilfe eines Arrays ausgeben

Hallo 🙂
ich muss folgende Aufgabe lösen:
Implementieren Sie ein Programm zum Darstellen eines Histogramms. Die Daten sollen als Array von double-Werten gegeben sein, z.B.:
double[] data1 = {
1.1, 1.9, 2.2, 3.0, 5.1, 5.2, 4.3, 0.1, 4.5, 5.1
};
double[] data2 = {
8.0, 6.0, 4.0, 1.0, 2.0, 3.0, 4.0, 9.0
};
Sie brauchen sich nicht um die Eingabe der Daten zu kümmern. Das Array der Daten soll beliebig sein, kann aber als Variable fest im Programm deklariert sein. Die Daten sollen als einfaches Balkendiagramm in ASCII dargestellt werden. Dazu benötigen Sie lediglich die Funktion System.out.println. Sind die Daten zum Beispiel wie oben gegeben, dann könnte die Ausgabe zum Beispiel so aussehen:
6| X
5| XX X
4| XXX XX
3| XXXX XX
2| XXXXXX XX
1| XXXXXXXXX
+ --3--6--9--
Hinweis:
Beachten Sie, dass die Länge des Eingabe-Arrays unterschiedlich groß sein kann;
und dass im Array beliebig große Wert enthalten sein können.

Und das habe ich bisher:
Java:
public class Main {
    public static void main(String[] args){

        double[] balkenlange = {4.0,2.0,3.0,4.0,5.0,1.0,2.0,3.0,4.0,5.0}; //beliebiges Array zur //Angabe der Längen der Balken (ein Wert entspricht einer Balkenlänge)

        String wert="X";                        //ein Wert in einem Balken
        String reihe="";                        //eine Zeile/Reihe im Histogramm
        int balkenanzahl=balkenlange.length;    //Anzahl der Balken
        int i=0;                                //Deklarieren von i im Vorhinein

        int maxbalken= (int) Double.MAX_VALUE; //Maximale Balkenhöhe
        double counter=maxbalken; //ein Counter der nach jeder Reihe des Histogramms //dekrementieren soll, beginnend be der ersten Reihe im Histogramm

        for (int k=0; k<balkenanzahl; k++){         //für jede Stelle des Arrays gilt...
            if (balkenlange[k]>maxbalken) {         //wenn ein Wert im Array größer ist, als die //maximale Balkenlänge,
                maxbalken= (int) balkenlange[k];    //dann wird dieser Wert zur maximalen //Balkenlänge
            }
        }


        for (int j=0; j<=maxbalken; j++) {          //für jede Reihe im Histogramm gilt:
            for (i = 0; i <= balkenanzahl; i++) {   //für jeden Wert einer Reihe im Histogramm //gilt:
                if (counter>=balkenlange[i]) {      //wenn der counter >=eines Werts im Array,
                    wert = "X";                     //so erhält er die Ausgabe X
                } else if (counter<balkenlange[i]) { //ist der Wert kleiner,
                    wert = " ";                     //so bleibt die Stelle in der Ausgabe frei
                }
                reihe=reihe+wert;           //ein Wert wird der Reihe hinzugefügt
                System.out.print(reihe);    //die Reihe wird ausgegeben
            }
            counter--;                      //der Counter wird dekrementiert
            System.out.print("\n");         //ein Absatz, die nächste Reihe ist dran
        }


    }


}

Das Problem ist, dass ich denke, dass mein Code funktionieren müsste, aber die Console spuckt mir nur das hier aus:

"C:\Program Files\Java\jdk-9.0.1\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.5\lib\idea_rt.jar=53684:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Name\IdeaProjects\1BlattSEP\out\production\1BlattSEP Main
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Main.main(Main.java:23)

Process finished with exit code 1

Ich habe jetzt noch nicht mal versucht so etwas wie ein Koordinatensystem zu erstellen, und ich bin totaler Anfänger habe also auch noch nie so eine ähnliche Aufgabe gelöst, vorher noch nicht mal mit Arrays in Java gearbeitet... Wäre toll wenn mir irgendjemand helfen kann.
 
Okay, also wenn da steht:
Code:
if (counter>=balkenlange[i]) {
Die Variable i kann also für einen Wert im Array stehen, der darin gar nicht enthalten ist? Sprich für unendlich viele Werte im Array balkenlange? Muss ich dann diese Variable einschränken?
 
Die Variable i kann also für einen Wert im Array stehen, der darin gar nicht enthalten ist? Sprich für unendlich viele Werte im Array balkenlange? Muss ich dann diese Variable einschränken?
i ist ja speziell nur der Index. D.h. hier darfst du die Schleife nicht über die "Werte" des Arrays laufen lassen, sondern nur von 0 bis zur Länge des Arrays.
 
aber mache ich das nicht schon in Zeile 22?:
Java:
for (i=0; i<=balkenanzahl; i++) {
in Zeile 23
Java:
if(counter>=balkenlange[i]) {
möchte ich ja immer genau einen Index im Array anschauen und ihn mit meinem counter vergleichen...
 
Wenn dein balkenanzahl = 10 ist, dein Array also 10 Einträge hat, dann sind die Indizes 0-9 vorhanden.

Im letzten Durchgang versuchst du aber auf Index 10 zuzugreifen.
 
Wenn dein balkenanzahl = 10 ist, dein Array also 10 Einträge hat, dann sind die Indizes 0-9 vorhanden.

Im letzten Durchgang versuchst du aber auf Index 10 zuzugreifen.
Ah verstehe!
Hier ist der Fehler. Lass mal das = weg. Du versuchst ein Element zuviel aus dem Array zu holen.
das habe ich jetzt mal gemacht, danke!
Allerdings scheint der Code immer noch nicht fehlerlos zu sein: Jetzt gibt mir die Konsole ausnahmslos und endlos Xe aus 😕
 
Ja, weil du counter von Double.MAX_VALUE aus runterzählst, das wird ein Weilchen dauern ... deshalb siehst du nur Xe

Edit: und du fügst immer zu reihe dazu, d.h. das wird immer länger. Du solltest es zu Beginn in der äusseren Schleife auf "" setzen.

Zum ersten Teil: Tja das kommt davon wenn man blind irgendwelche Codes abschreibt... Ist geändert:
Code:
int maxbalken= 0; //Maximale Balkenhöhe
double counter; //ein Counter der nach jeder Reihe des Histogramms dekrementieren soll, beginnend be der ersten Reihe im Histogramm

for (int k=0; k<balkenanzahl; k++){         //für jede Stelle des Arrays gilt...
    if (balkenlange[k]>maxbalken) {         //wenn ein Wert im Array größer ist, als die maximale Balkenlänge,
        maxbalken= (int) balkenlange[k];    //dann wird dieser Wert zur maximalen Balkenlänge
    }
}
counter=maxbalken;
da bekomme ich jetzt dieses Output...:

"C:\Program Files\Java\jdk-9.0.1\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.5\lib\idea_rt.jar=54031:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Name\IdeaProjects\1BlattSEP\out\production\1BlattSEP Main
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX XXXX XXXXX XXXXXX XXXXXXX XXXXXXXX XXXX
X XX XX XX XX X XX XX XX XXX XX XXX XX XXX
X X X X X X X XX X XX X XX X XX
X X X X X


Process finished with exit code 0

ich habe immer noch zu lange Zeilen und es scheint mir das Histogramm von oben nach unten aufzuziehen...
 

Zurück
Oben