Datentypen Array: auslesen der Länge der jeweiligen Dimension

Javinner

Top Contributor
Hallo an alle,

mit der Methode length kann die Länge eines Strings oder Arrays ermittelt werden. Nun bin ich gerade bei einer Aufgabe angekommen, welches die Länge eines Arrays ausliest.
Aufgabenstellung:
- vor der Abfrage soll die Tagesanzahl des jeweiligen Monats ermittelt werden.
Java:
abfrageTag(); //Infomeldung
tag = scanner.nextInt();
tag -= 1;
monatsTage = kalender[jahr][monat].length; /** Hier funktioniert es */
if(tag < 0 || tag > monatsTage)
{
    falscheEingabe();
    break;
}

Nun wollte ich es etwas austesten:
Java:
package testarray;

public class TestArray
{

    final static int JAHR = 10;
    final static int MONAT = 12;
    final static int TAG = 31;
    final static int STUNDE = 24;

    public static void main(String[] args)
    {
        int[][][][] kalender = new int[JAHR][MONAT][TAG][STUNDE];
       
        for(int [][][] jahr : kalender)
        {
            for(int [][] monat : jahr)
            {
                for(int[] tag : monat)
                {
                    for(int stunde = 0; stunde < tag.length; stunde++){
                        System.out.print(stunde);
                    }
                    System.out.println();
                }
                System.out.println();
            }
            System.out.println();
        }

        int jahr = kalender.length; //10
        int monat = kalender[JAHR].length;//12            /** Zeile: Nr. 33 */
        int tag = kalender[JAHR][MONAT].length;//31
        int zeit = kalender[JAHR][MONAT][TAG].length;//24

        System.out.println("Jahr: " + jahr + " Monat: " + monat + " Tag: " + tag + " Zeit: " + zeit);
    }
}

/** Fehlermeldung */
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at testarray.TestArray.main(TestArray.java:33)
C:\Users\EndeJuli2017\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
Warum bekomme ich hier eine Fehlermeldung?
Irgendwie stehe ich auf dem Schlauch.
 

Javinner

Top Contributor
JAHR ist 10. Das Array ist 10 lang, fängt aber bei Index 0 an. also gehen die Indices von 0 bis 9.
Das ist klar. Hier wollte ich nur zu Testzwecken die jeweilige Länge in einer Variablen speichern und diese dann in der Konsole ausgeben lassen.
Als Beispiel int monat = kalender[JAHR].length;, dann hätte ja die Konsole die Variable monat mit 11 ausgeben sollen, oder?

edit:
Das Resultat habe ich erwartet:
Java:
System.out.println(Array.getLength(kalender));
System.out.println(Array.getLength(kalender[0]));
System.out.println(Array.getLength(kalender[0][0]));
System.out.println(Array.getLength(kalender[0][0][0]));

//Konsolenausgabe
10
12
31
24
 
Zuletzt bearbeitet:

JCODA

Top Contributor
Als Beispiel int monat = kalender[JAHR].length;, dann hätte ja die Konsole die Variable monat mit 11 ausgeben sollen, oder?
Leider verstehe ich deinen Beitrag nicht. Könntest du den kompletten Code posten?
Du greifst hier auf die äußerste Dimension zu. Diese hat eben nur Länge 10, d.h. hier darf man nicht 10 als Index nehmen.
Mache dir klar was du tust, du greifst in diesen 3 Zeilen immer auf die Länge der jeweiligen Dimension zu, das geht aber nicht. Du müsstest überall 1 abziehen.
 

Javinner

Top Contributor
Siehe monatsTage = kalender[jahr][monat].length;
Hier funktioniert die Abfrage des Wertes und man kann diesen Wert in der
Variablen monatsTage speichern.
Und genau dies wollte ich austesten, funktioniert jedoch leider nicht so, wie erwartet. Die Methode Array.getLength() zeigt auf, welches Ergebnis ich erwartet hätte. Jetzt versuche ich herauszufinden, woran ich gerade scheitere.

Quelle: http://www.grundkurs-java.de
Kapitel 5: Referenzdatentypen (habe mir das Buch natürlich gekauft).
Java:
package kalendernachbau;

import java.util.Scanner;

public class KalenderNachbau
{

    final static int JAHR = 10;
    final static int JAHR_VERRECHNUNG = 2000;
    final static int MONAT = 12;
    final static int STUNDE = 24;

    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        String[][][][] kalender = new String[JAHR][MONAT - 1][][];
        for (String[][][] kalender1 : kalender) {
            for (int monat = 0; monat < kalender1.length; monat++) {
                switch (monat) {
                    case 0:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//Januar
                    case 1:
                        kalender1[monat] = new String[28][STUNDE];
                        break;//Februar
                    case 2:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//Maerz
                    case 3:
                        kalender1[monat] = new String[30][STUNDE];
                        break;//April
                    case 4:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//Mai
                    case 5:
                        kalender1[monat] = new String[30][STUNDE];
                        break;//Juni
                    case 6:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//Juli
                    case 7:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//August
                    case 8:
                        kalender1[monat] = new String[30][STUNDE];
                        break;//September
                    case 9:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//Oktober
                    case 10:
                        kalender1[monat] = new String[30][STUNDE];
                        break;//November
                    case 11:
                        kalender1[monat] = new String[31][STUNDE];
                        break;//Dezember
                }
            }
        }

        //Schaltjahr
        kalender[0][1] = new String[29][STUNDE];//2000
        kalender[4][1] = new String[29][STUNDE];//2004
        kalender[8][1] = new String[29][STUNDE];//2008

        //Befullen des Arrays mit leeren String
        for (String[][][] jahr : kalender) {
            for (String[][] monat : jahr) {
                for (String[] tag : monat) {
                    for (int stunde = 0; stunde < tag.length; stunde++) {
                        tag[stunde] = "";
                    }
                }
            }
        }

        boolean fertig = false;
        int jahr, monat, tag, uhrzeit, menu, monatsTage;

        while (!fertig) {
            druckeAuswahlMenu();
            menu = scanner.nextInt();
            switch (menu) {
                case 1:
                    abfrageJahr();
                    jahr = scanner.nextInt();
                    jahr -= JAHR_VERRECHNUNG;
                    if (jahr < 0 || jahr > (JAHR - 1)) {
                        falscheEingabe();
                        break;
                    }
                    abfrageMonat();
                    monat = scanner.nextInt();
                    monat -= 1;
                    if (monat < 0 || monat > (MONAT - 1)) {
                        falscheEingabe();
                        break;
                    }
                    abfrageTag();
                    tag = scanner.nextInt();
                    tag -= 1;
                    monatsTage = kalender[jahr][monat].length;
                    if (tag < 0 || tag > monatsTage) {
                        falscheEingabe();
                        break;
                    }
                    abfrageZeit();
                    uhrzeit = scanner.nextInt();
                    if (uhrzeit < 0 || uhrzeit > (STUNDE - 1)) {
                        falscheEingabe();
                        break;
                    }
                    kalender[jahr][monat][tag][uhrzeit] = neuerTermin();
                    break;
                case 2:
                    druckeTermine(kalender);
                    break;
                case 3:
                    fertig = true;
                    break;
                default:
                    falscheEingabe();
            }
        }
    }

    static void druckeAuswahlMenu()
    {
        System.out.println("1: Termin anlegen"
                + "\n2: Termine zeigen"
                + "\n3: Verlassen");
    }

    static void druckeTermine(String[][][][] array)
    {
        for (int jahr = 0; jahr < array.length; jahr++) {
            for (int monat = 0; monat < array[jahr].length; monat++) {
                for (int tag = 0; tag < array[jahr][monat].length; tag++) {
                    for (int stunde = 0; stunde < array[jahr][monat][tag].length; stunde++) {
                        if (!array[jahr][monat][tag][stunde].equalsIgnoreCase("")) {
                            System.out.println("Jahr: " + jahr + ", Monat: " + monat + ", Tag: " + tag + ", Uhrzeit: " + stunde + ", Termin: " + array[jahr][monat][tag][stunde]);
                        }
                    }
                }
            }
        }
    }

    static void falscheEingabe()
    {
        System.out.println("Falsche Eingabe");
    }

    static void abfrageJahr()
    {
        System.out.println("Eingabe Jahr: zwischen 2000 und 2009");
    }

    static void abfrageMonat()
    {
        System.out.println("Welcher Monat?");
    }

    static void abfrageTag()
    {
        System.out.println("Welcher Tag?");
    }

    static void abfrageZeit()
    {
        System.out.println("Welche Uhrzeit?");
    }

    static String neuerTermin()
    {
        System.out.println("Eingabe Termin:");
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        return string;
    }

}
 

JCODA

Top Contributor
bei diesem Code ist jahr, monat usw klein geschrieben, da kommen die Werte aus den Schelifen und die sind immer <Länge.
 

Javinner

Top Contributor
bei diesem Code ist jahr, monat usw klein geschrieben, da kommen die Werte aus den Schelifen und die sind immer <Länge.
Das ist richtig.
Letztendlich sollte das Testprogramm nur die Vorgehensweise festigen:
int laengeBestimmteDimension = array[...]BestimmteDimension.length
Java:
/** Original Code aus der Bibliothek*/
/**
* Returns the length of the specified array object, as an {@code int}.
*
* @param array the array
* @return the length of the array
* @exception IllegalArgumentException if the object argument is not
* an array
*/
public static native int getLength(Object array)
    throws IllegalArgumentException;
Leider sehe ich nicht, wie der Programmierer hier an die Sache herantritt.
Werde jetzt bissle googeln.
 

JCODA

Top Contributor
Ich glaube du verrennst dich gerade.
Es geht doch nur darum die Länge festzustellen, hierfür musst du halt auf eine Dimension zugreifen die es bereits gibt.
Hab' ich dein Zeil falsch verstanden?
 

Javinner

Top Contributor
Ich glaube du verrennst dich gerade.
Es geht doch nur darum die Länge festzustellen, hierfür musst du halt auf eine Dimension zugreifen die es bereits gibt.
Hab' ich dein Zeil falsch verstanden?
Absolut! Nur wie gehe ich da vor, ohne die Array.getLength() Methode zu benutzen.
So auf die Schnelle finde ich nirgends geschrieben, wie die Methode getLength() hier vorgeht, was da genau passiert..Kann ich nicht nachvollziehen.
 

JCODA

Top Contributor
Überlege mal genau was du hier tust:
Java:
        int monat = kalender[JAHR].length;//12            /** Zeile: Nr. 33 */
        int tag = kalender[JAHR][MONAT].length;//31
        int zeit = kalender[JAHR][MONAT][TAG].length;//24
Mache dir klar, welchen Wert JAHR, MONAT, TAG haben.
Erwartest du das gleiche Ergebnis wenn du statt diesen Konstanten überall 0 einsetzt?
 

Javinner

Top Contributor
Jetzt bin ich ziemlich verwirrt!
Kann es im Augenblick nicht verstehen, warum bei A und B am Ende das Gleiche rauskommt..
Java:
/** A */
int jahr = kalender.length;
int monat = kalender[JAHR - 1].length;
int tag = kalender[JAHR - 1][MONAT - 1].length;
int zeit = kalender[JAHR - 1][MONAT - 1][TAG - 1].length;
System.out.println("Jahr: " + jahr + ", Monat: " + monat + ", Tag: " + tag + ", Zeit: " + zeit);
      
/** B */ 
int jahrA = kalender.length;
int monatA = kalender[0].length;
int tagA = kalender[0][0].length;
int zeitA = kalender[0][0][0].length;
System.out.println("Jahr: " + jahrA + ", Monat: " + monatA + ", Tag: " + tagA + ", Zeit: " + zeitA);
/** A: Jahr: 10, Monat: 12, Tag: 31, Zeit: 24*/
/** B: Jahr: 10, Monat: 12, Tag: 31, Zeit: 24*/
 

Javinner

Top Contributor
Ich glaube, es leuchtet jetzt langsam ein.
Vier Dimensionen haben meine Vorstellungskraft wohl gesprengt :)
Java:
package testarrayzwei;


public class TestArrayZwei
{
    public static void main(String[] args)
    {
        int[][] array = {{1, 2, 3, 4, 5},
                         {6, 7},
                         {8},
                         {9, 10, 11}};
   
        int i1 = array.length;
        int i2 = array[0].length;
        int i3 = array[1].length;
        int i4 = array[2].length;
        int i5 = array[3].length;
   
        System.out.println("i1: " + i1 + ", i2: " + i2 + ", i3: " + i3 + ", i4: " + i4 + ", i5: " + i5);
    }
}
/** Ergebnis: i1: 4, i2: 5, i3: 2, i4: 1, i5: 3*/

@JCODA Vielen Dank!
 

Neue Themen


Oben