Länge der Monate zuweisen

Windows10

Bekanntes Mitglied
Ich habe folgende zwei Arrays, aber wie kann ich das int-Array (mit den Monatslängen) auf die String-Array (Monatsnamen) zuweisen?
Java:
 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"};
 
K

kneitzel

Gast
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

Bekanntes Mitglied
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.
Können Sie mir einen Beispielcode zur dritten Idee schreiben?
 
K

kneitzel

Gast
Code:
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

Top Contributor
Moin,

zumal dies hier
Java:
 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 :cool:
Nimm also kneitzel's Lösung !

Gruß Klaus
 
K

kneitzel

Gast
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

Top Contributor
Du könntest auch einen anderen Ansatz verfolgen und dir eine Month Klasse erstellen.
Java:
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.
Java:
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
Java:
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()));
    }
}
 
X

Xyz1

Gast
Nicht beirren lassen, das ist wahrscheinlich genau das, was du suchst:
Java:
    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)));
    }
 

Neue Themen


Oben