# Länge der Monate zuweisen



## Windows10 (30. Mrz 2016)

Ich habe folgende zwei Arrays, aber wie kann ich das int-Array (mit den Monatslängen) auf die String-Array (Monatsnamen) zuweisen?

```
int[]monthDays={31,28,31,30,31,30,31,31,30,31,30,31};
        String[]monthNames={"Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
```


----------



## kneitzel (30. Mrz 2016)

Also Du willst vom Manatsnamen (Also z.B. "März") zu der Anzahl der Tage kommen?

Erste Idee: Du hast Daten, die zusammen gehören und daher solltest Du die Daten in einer Klasse Kapseln. Dann hast Du Monate mit den Anzahl der Tagen direkt dabei.

Zweite Idee: Du willst von einem Wert auf einen anderen kommen. Dafür gibt es die Map. Du kannst Also eine HashMap füllen mit String, Integer Werten.

Dritte Idee: Deine aktuellen Daten bleiben so wie sie sind. Um die Aufgabe zu bewerkstelligen gehst Du das Array mit den Namen durch, bis Du den Monat gefunden hast. Und dann hast Du ja den Index und kannst damit auf das zweite Array zugreifen und die Anzahl der Tage auslesen.


----------



## Windows10 (30. Mrz 2016)

kneitzel hat gesagt.:


> Also Du willst vom Manatsnamen (Also z.B. "März") zu der Anzahl der Tage kommen?
> 
> Erste Idee: Du hast Daten, die zusammen gehören und daher solltest Du die Daten in einer Klasse Kapseln. Dann hast Du Monate mit den Anzahl der Tagen direkt dabei.
> 
> ...


Können Sie mir einen Beispielcode zur dritten Idee schreiben?


----------



## kneitzel (30. Mrz 2016)

```
public int getDaysOfMonth(string month) {
  int index = 0;
  while (index < monthNames.length) {
    if (monthNames[index].equals(month))
      return monthDays[index];
  }
  thrown new IllegalArgumentException("Month unknown!");
}
```


----------



## VfL_Freak (31. Mrz 2016)

Moin,

zumal dies hier


Windows10 hat gesagt.:


> ```
> int[]monthDays={31,28,31,30,31,30,31,31,30,31,30,31};
> String[]monthNames={"Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
> ```


alleine schon in Schaltjahren nicht klappen wird 
Nimm also kneitzel's Lösung !

Gruß Klaus


----------



## kneitzel (31. Mrz 2016)

Nunja, meine Logik basierte noch auf diesen Arrays und zeigte nur das durchsuchen.

Aber die Lösung ist alles andere als optimal, da hier Daten nicht zusammen hängen, die zusammen gehören.


----------



## Jardcore (31. Mrz 2016)

Du könntest auch einen anderen Ansatz verfolgen und dir eine Month Klasse erstellen.

```
public class Month {
    private String name;
    private int days;
  
    public Month(String name, int days) {
        this.name = name;
        this.days = days;
    }

    //... getter
}
```
Die Klasse kapselt dir die benötigten Informationen in einem Objekt.

Zur Verwaltung deiner Monate und zum Ausgeben gewünschter Informationen kannst du dir dann eine weitere Klasse bauen. In deinem Fall ist das die in der die jetzigen Arrays liegen... nennen wir sie mal MonthHandler.
Der MonthHandler würde jetzt alle 12 Monate erstellen und die jeweiligen Namen und Tage abspeichern.

```
public class MonthHandler {
 
    private Map<Integer, Month> map;
    private static final int MAX_MONTHS = 12;
 
    // Erstellung der 12 Monate mit Name und Tagen
    public MonthHandler(int year) {
        map = new HashMap<Integer, Month>();
        for(int month = 0; month < MAX_MONTHS; month++) {
            map.put(month, new Month(new DateFormatSymbols().getMonths()[month], numberOfDaysInMonth(month, year)));
        }         
    }
 
    private int numberOfDaysInMonth(int month, int year) {
       return new GregorianCalendar(year, month, 1).getActualMaximum(Calendar.DAY_OF_MONTH);
    }
 
    public Month getMonth(int monthIndex) {
        return map.get(monthIndex);
    }
}
```
Anders als in deinem Versuch, würden die Tage der Monate hier automatisch abhängig vom Jahr ermittelt werden und zum späteren Gebrauch abgespeichert werden. Der User kann nun durch die public Methode getMonth(int monthIndex) ein Month Objekt bekommen und auf diesem den Namen und die Tage abfragen. Den Index bekommt man von der statischen Variable der Calendar Klasse. Die hat schon Konstanten für die jeweiligen Monate Calendar.APRIL Calendar.MAY... usw.

Ein möglicher Aufruf könnte so aussehen

```
public class Main {

    public static void main(String[] args) {
        MonthHandler monthHandler = new MonthHandler(2016);
        Month month = monthHandler.getMonth(Calendar.APRIL);
        System.out.println(String.format("Der %s hat %d Tage", month.getName(), month.getDays()));
    }
}
```


----------



## Xyz1 (2. Apr 2016)

Nicht beirren lassen, das ist wahrscheinlich genau das, was du suchst:

```
static int[] monthDays
            = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static String[] monthNames
            = {"Jänner", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};

    static int nameToDays(String name) {
        for (int i = 0; i < monthNames.length; i++) {
            if (monthNames[i].equalsIgnoreCase(name)) {
                return monthDays[i];
            }
        }
        return -1;
    }

    static String[] daysToMonths(int days) {
        String[] strings = new String[monthNames.length];
        int i = 0;
        for (int j = 0; j < monthNames.length; j++) {
            if (monthDays[j] == days) {
                strings[i++] = monthNames[j];
            }
        }
        strings = Arrays.copyOf(strings, i);
        return strings;
    }

    /**
     * @author DerWissende on 04/02/2016
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(nameToDays("februar"));
        System.out.println(Arrays.toString(daysToMonths(31)));
    }
```


----------

