Java: Wie kann ich Geburtsdaten in einer ArrayList speichern und wie kann ich immer das zum aktuellen Datum nächstliegende, an die erste Stelle sortieren?

4 Antworten

und verstehe einfach die ArrayList nicht

Was hast du denn bisher gelernt? Hast du ein Lehrbuch oder einen Kurs, den du verfolgst? Wenn nicht, hilft vielleicht erstmal das hier: https://openbook.rheinwerk-verlag.de/javainsel/16_001.html#u16.1

Das mit dem aufschreiben geht auch, jedoch wie speichere ich die in einer ArrayList und kann sie dann anzeigen lassen?

Ganz naiv als Strings z.B. so:

List<String> birthdays = new ArrayList<>();

birthdays.add("2009-12-05");
birthdays.add("1998-01-13");

for(String b: birthdays) {
    System.out.println(b);
}
Und wie kann ich es so machen dass immer das Datum dass am nächsten zum aktuellen Datum ist an 1. Stelle angezeigt wird?

Da musst du ein bisschen mehr Hirnschmalz reinstecken und dir überlegen, was du damit meinst - meinst du eigentlich jenes Datum, dessen Wiederholung in der Zukunft am nächsten liegt?

Auch für eine simple Sortierung nach Datumsdifferenz wirst du aber die Daten nicht als Strings, sondern in einer dafür geeigneten Klasse wie LocalDate speichern:

List<LocalDate> birthdays = new ArrayList<>();

birthdays.add(LocalDate.of(2009, 12, 05));
birthdays.add(LocalDate.of(1998, 1, 13));

for (LocalDate b : birthdays) {
    System.out.println(b);
}

Die kann man dann sortieren, im einfachsten Fall etwa so:

birthdays.sort(LocalDate::compareTo);

Aber da sind wir schon bei Themen, die deinen Wissensstand etwas übersteigen.


malte314  13.08.2021, 14:11

Omg wieso fangen bei LocalDate die Monate plötzlich bei 1 an?? Was ist dann denn für eine Inkonsistenz liebes jdk

0
alfredo153  13.08.2021, 14:15
@malte314

Die bei 0 startenden Monate waren eine beliebte Fehlerquelle und einer der vielen Gründe, warum man die antiken Datums- und Zeitklassen wie Date und Calendar schon längst nicht mehr verwenden sollte.

0
Nerom 
Beitragsersteller
 13.08.2021, 15:53

Warte mal und wie kann ich es so machen dass man einfach in der Konsole die Daten angeben kann halt mit nem Scanner und dann wird das Datum automatisch hinzugefügt?

0
(...)  jedoch wie speichere ich die in einer ArrayList (...)

Erst legst du eine Liste an.

List<LocalDate> birthdays = new ArrayList<>();

Als Elementtyp eignen sich LocalDate-Instanzen und für den Datentyp der Variable wähle ich das Interface List (welches der konkrete Typ ArrayList implementiert). So kann später bei Bedarf der konkrete Listtyp auch flexibel noch einmal ausgetauscht werden.

Dann fügst du der Liste ein Datum zu:

birthdays.add(LocalDate.of(2021, 8, 13));
Und wie kann ich es so machen dass immer das Datum dass am nächsten zum aktuellen Datum ist an 1. Stelle angezeigt wird?

Sortiere die Liste, bevor du ein Datum herausgreifst. Die Collections-API kann dabei helfen.

Collections.sort(birthdays, (LocalDate date, LocalDate otherDate) -> {
  boolean dateIsPast = date.isBefore(LocalDate.now());
  boolean otherDateIsPast = otherDate.isBefore(LocalDate.now());

  if (dateIsPast != otherDateIsPast) {
    return dateIsPast ? 1 : -1;
  }

  return dateIsPast ? otherDate.compareTo(date) : date.compareTo(otherDate);
});

Das zweite Argument dieser Methode ist ein Lambda-Ausdruck, der das Vergleichsverfahren beim Sortieren beschreibt (je Sortierschritt wird ein Element aus der Liste mit einem anderen verglichen).

Eine ArrayList ist eine Liste, die auf der Grundlage eines Arrays implementiert wurde. Alle Daten werden also im Hintergrund in einem Array gespeichert. Die ArrayList ist also quasi ein "super array".

Die Klasse ArrayList ist generisch und hat einen type-parameter, der festlegt, welche Art von Objekte in der Liste gespeichert sind.

ArrayList<Integer> intList = new ArrayList<>();

... erzeugt eine ArrayList, in welcher "Integer" gespeichert werden können. Primitive Typen (int, boolean, char etc.) können nicht gespeichert werden, weil das generic type system in Java bisschen schlecht ist. Es müssen die jeweiligen Boxing-Klassen (Integer, Boolean, Character, etc.) verwendet werden.

In deinem Fall würde es sich anbieten, Datums zu speichern:

import java.util.*;
// ...
ArrayList<Date> bdays = new ArrayList<>(10);

Die 10 im Konstruktor initialisiert den speicher-Array mit der Länge 10, um Performance zu sparen. Ersetze die 10 einfach durch eine passende Zahl, also so ungefähr die menge an Geburtstagen, die du speichern willst.

Datums werden wie folgt kreiert:

Calendar cal = Calendar.getInstance();
// Datums spuckt der Kalender wie folgt aus:
cal.set(2004, Calendar.JANUARY, 13);
// ^setzt den Kalender auf den 13.01.2004
Date bday = cal.getTime();
// bday ist jetzt ein "Date", welches den 13.01.2004 repsäsentiert
// Dieses Datum kann jetzt der Liste zugefügt werden:
bdays.add(bday);
// jetzt können wir andere Geburtsdaten hinzufügen:
cal.set(2004, Calendar.FEBRUARY, 18);
bdays.add(cal.getTime());
// ...

Als nächstes können wir die Liste sortieren.

bdays.sort(Date::compareTo);

... so einfach geht das sortieren! (sortiert sind die jetzt von "alt" nach "jung", das Jahr wurde dabei auch berücksichtigt)

Als letztes können wir alle Datums ausgeben, die jetzt ja sortiert sind:

SimpleDateFormat dFormat = new SimpleDateFormat("dd.MM.yyyy");

for (Date d : bdays) {
    System.out.println(dFormat.format(d));
}
Woher ich das weiß:Hobby
import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> bdays = new ArrayList<String>();
    bdays.add("12.05.2001"); // Hier den Geburtstag reinmachen

    for (int i = 0; i < bdays.size(); ++i) {
      System.out.println(cars.get(i));  // Ausgeben
    }
  }
}