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.
 
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:
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.
 
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;
    }

}
 
bei diesem Code ist jahr, monat usw klein geschrieben, da kommen die Werte aus den Schelifen und die sind immer <Länge.
 
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.
 
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?
 
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.
 
Ü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?
 
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*/
 
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


Zurück
Oben