# Mehrdimensionales Array in Funktion übergeben & Werte auslesen



## Saheeda (27. Juni 2014)

Hallo,

ich arbeite erst seit ein paar Tagen mit Java und möchte zur Übung einen Terminkalender erstellen.

Bisher werden die Werte über einen Scanner von der Konsole eingelesen, auf Plausibilität (keine Monate mit 40 Tagen etc,) überprüft und anschließend im Array gespeichert.

Jetzt möchte ich dazu einen Test ausführen, der überprüfen soll, ob z.B. kalender[2009][12][23][16] einen Eintrag ermöglicht.
Wenn ich der Funktionen einen Array übergebe, wie sage ich ihr, welchen Wert sie sich aus welcher Dimension holen soll?

Blöd gesagt versuche ich, das hier auszudrücken:
int jahr = kalender[ i ][ ][ ][ ]
int monat = kalender[ ][ j ][ ][ ]
int tag = kalender[ ][ ][ k ][ ]
int stunde = kalender[ ][ ][ ][ l ]



```
public static String newEntry(String kalender[][][][]){

int jahr = in.nextInt();
[....]
int monat = in.nextInt();
[....]
}
```


Danke!


----------



## Harrier (29. Juni 2014)

Hi,

also mir ist noch nicht so ganz klar, was du hier genau machen willst. Was ist denn die "in" Variable in deinem Code?

Also der Funktion übergibst du ein 4-dimensionales String Array. Was soll denn genau in diesen Strings stehen? Also was genau soll mir kalender[2009][12][23][16] denn zurück geben?

Unabhängig davon denke ich, dass ein Array für deinen Zweck sehr ungeeignet ist. Sagen wir mal, du willst 10 Jahre abdecken. Jedes Jahr hat 12 Monate. Ein Monat hat bis zu 31 Tage (d.h. die dritte Dimension muss 31 Einträge zulassen) und jeder tag 24 Std. Du hast also 10*12*31*24 Einträge = ca. 90000. Selbst wenn dein Kalender völlig leer ist, belegst du damit bereits 4*90000 = 360000 Bytes. Zusätzlich hast du auch einige Einträge, die überhaupt nicht existieren sollten: kalender[2009][2][31][10] (also 31. Februar) existiert hier ja auch.

Ich nehme jetzt einfach mal an, du hattest vor, für jede Stunde, in der du einen Termin hast, einen String abzuspeichern, in dem drin steht, was du tun wolltest. Also z.B. kalender[2009][12][31][23] = "Silvester feiern";

Für so etwas könntest du dir z.B. die HashMap-Klasse ansehen. Die erlaubt es dir, für einen sogenannten Key einen Wert abzuspeichern. Als key könntest du einen String im Format "jahr.monat.tag.stunde" nehmen. Das sähe dann in etwa so aus:


```
HashMap<String,String> kalender = new HashMap<String,String>();
kalender.put("2009.12.31.23", "Silvester feiern");
```

Auf diese Weise speicherst du nur dann einen String ab, wenn du auch tatsächlich einen Termin hast.
Bei der Gelegenheit lernst du auch gleich ein bisschen was über generische Datentypen, wie HashMap.

Falls ich den Zweck von deinem Programm falsch verstanden habe, erklär' bitte nochmal etwas genauer, was du erreichen willst.

Viele Grüße


----------



## Saheeda (29. Juni 2014)

Hi,

"in" ist mein Scanner, der Einträge aus der Konsole liest.

Ich hab das Ganze nochmal komplett umgestaltet und vereinfacht. Ich hab jetzt eine Funktion, die nach und nach die Werte von der Konsole ausliest (und gleichzeitig überprüft). Eine zweite wiederum bekommt die Werte übergeben, nimmt die Werte als Indizes und speichert den Termin:
[2000][1][1][0] = "Silvester"

Die Trennung zwischen Datenaufnahme und Datenspeicherung habe ich gemacht, um einen Test drüberlaufen lassen zu können. Das eigentliche Programm bekommt seine Werte über die Konsole, der Test übergibt sie einfach an die Funktion. Ich finde es eigentlich ziemlich umständlich, das so aufzuschlüsseln, weiß aber nicht, wie ich es sonst raffen soll (Funktion ohne Parameter vs. Funktion mit Parameter).



```
public static void setDataViaConsole() {
        System.out.println("Welches Jahr? ");
        int year = in.nextInt();
        while (year < 2000 || year > 2009) {
            System.out.println("Jahr ungültig");
            year = in.nextInt();
        }

       [.............]

        setEntryInCalendar(year,month,day,hour,toDo);
    }

public static String setEntryInCalendar(int year, int month, int day, int hour, String toDo) {

       [...............]

        calendar[yearToSave][monthToSave][dayToSave][hourToSave] = toDoSave;
```


Warum ich einen Array genommen habe? Weil das in meinem Buch ne Übung für's Arbeiten mit Arrays ist ;-)

Mit HashMaps habe ich bisher noch nicht gearbeitet, werde es mir aber mal ansehen. Danke für den Tipp!


----------



## youza (1. Juli 2014)

Wenn du schon am Java lernen bist würde ich an deiner Stelle gleich versuchen objektorientiert zu arbeiten.
Du könntest dir ein Objekt mit den gewünschten Eigenschaften erstellen welches ungefähr so aussehe:

```
public class CalendarEntry {
    private int year;
    private int month;
    private int day;
    private String toDo;
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public String getToDo() {
        return toDo;
    }
    public void setToDo(String toDo) {
        this.toDo = toDo;
    }
    @Override
    public String toString(){
        return year + "\t"+ month + "\t"+ day + "\t"+ toDo + "\n";
    }

}
```

In diesem werden deine Werte abgelegt und du könntest zu dem das Objekt noch um beliebige Funktionen erweitern.
Deine einlese Funktion sehe dann wie folgt aus:


```
import java.util.ArrayList;
import java.util.Scanner;

import com.tutorials.obj.CalendarEntry;

public class ConsoleInput {
  
    private ArrayList<CalendarEntry> calendar;
    private Scanner in;
    public ConsoleInput(){
        calendar = new ArrayList<CalendarEntry>();
        in = new Scanner(System.in);

    }
    public void addDataViaConsole() {
        CalendarEntry calendarEntry = new CalendarEntry();
        System.out.println("Welches Jahr? ");
        in = new Scanner(System.in);
        calendarEntry.setYear(in.nextInt());
        while (calendarEntry.getYear() < 2000 || calendarEntry.getYear() > 2009) {
            System.out.println("Jahr ungültig");
            calendarEntry.setYear(in.nextInt());
        }
        System.out.println("Welcher Monat? ");
        calendarEntry.setMonth(in.nextInt());
        while (calendarEntry.getMonth() < 1 || calendarEntry.getMonth() > 12) {
            System.out.println("Jahr ungültig");
            calendarEntry.setMonth(in.nextInt());
        }
        System.out.println("Welcher Tag? ");
        calendarEntry.setDay(in.nextInt());
        while (calendarEntry.getDay() < 1 || calendarEntry.getDay() > 31) {
            System.out.println("Jahr ungültig");
            calendarEntry.setMonth(in.nextInt());
        }
        System.out.println("Welches Ereignis? ");
        calendarEntry.setToDo(in.next());
        calendar.add(calendarEntry);

      
    }
    public void closeScanner(){
        in.close();
    }
    public ArrayList<CalendarEntry> getCalendar() {
        return calendar;
    }
    @Override
    public String toString(){
        String ret = "year\tmonth\tday\ttoDo\n";
        for (int i = 0; i < calendar.size(); i++) {
            ret = ret + calendar.get(i);
        }
        return ret;
    }
}
```

Dann brauchst du nur noch eine Main mit der du alles aufrufen kannst:


```
public class Main {

  
    public static void main(String[] args) {
        ConsoleInput ci = new ConsoleInput();
        for (int i = 0; i < 5; i++) {
            ci.addDataViaConsole();
        }
        ci.closeScanner();
        System.out.println(ci);
    }
  
}
```

ich hab dir das Ganze noch als Eclipse Projekt angehängt.

Viele Grüße
Youza


----------

