ArrayList mit Custom-Objekten nach Datum in String-Format sortieren?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Entweder du implementierst das Comparable-Interface oder du nutzt eine Klasse, die das Interface Comparator implementiert, dann allerdings als externe Komponente für den Vergleich zweier Objekte verantwortlich ist.

Beide Wege fordern die Implementierung einer Methode compareTo (Comparable) oder compare (Comparator). Für den Vergleich solltest du den String in ein Datumsobjekt parsen.

Beispiel mit Comparable:

class Homework implements Comparable<Homework> {
  private String _date;

  // ...

  public String getDate() {
    return _date;
  }

  @Override
  public int compareTo(Homework otherHomework) {
    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");

    try {
      Date date1 = format.parse(_date);
      Date date2 = format.parse(otherHomework._date);
      
      return date1.compareTo(date2);
    }
    catch (ParseException ex) {
      ex.printStackTrace();
      return 0; // or do something else
    }
  }
}

Beispiel Comparator:

class HomeworkComparator implements Comparator<Homework> {

  @Override
  public int compare(Homework homework, Homework otherHomework) {
    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");

    try {
      Date date1 = format.parse(homework.getDate());
      Date date2 = format.parse(otherHomework.getDate());

      return date1.compareTo(date2);
    }
    catch (ParseException ex) {
      ex.printStackTrace();
      return 0; // or do something else
    }
  }
}

Eigentlich solltest du deine Attribute als nicht öffentlich (protected oder private) deklarieren, um das Prinzip der Kapselung zu wahren. Demnach wären bei der zweiten Variante auch Getter-Methoden notwendig.

Um nun noch die Liste zu sortieren, kannst du die sort-Methoden nutzen, die bereits von der Standardbibliothek geboten werden.

ArrayList<Homework> homeworks = new ArrayList<>();
// fill list ...

// with comparable
Collections.sort();

// with comparator
homeworks.sort(new HomeworkComparator());

Dan6erbond 
Beitragsersteller
 27.02.2018, 10:21

Vielen, vielen Dank! Dank deiner Antwort läuft alles einwandfrei! Habe es mit dem Comparable gemacht und es funktioniert super!

0
Nun möchte ich alle Elemente in der ArrayList nach Datum sortieren, geht das?

Zunächst benötigst du dafür einen sogenannten Comparator, welcher für die Vergleiche der Hausaufgaben-Objekte zuständig ist. Die Methode compare muss eine positive Zahl zurückgeben, wenn das erste Objekt größer ist, 0, wenn sie gleich sind, und eine negative Zahl, wenn das erste Objekt kleiner ist. Dazu musst du zunächst die Jahreszahlen vergleichen. Sind diese identisch, schaust du dir die Monatszahlen an. Sind auch diese gleich, so betrachtest du den Tag. Hierfür muss das Datum zunächst in drei Integer aufgeteilt werden. Dies wäre eine Möglichkeit für deinen Fall:

class CustomComparator implements Comparator<Hausaufgabe> {
    @Override
    public int compare(Hausaufgabe h1, Hausaufgabe h2) {
      String[] date1 = h1.datum.split("[.]");
      int d1 = Integer.parseInt(date1[0]);
      int m1 = Integer.parseInt(date1[1]);
      int y1 = Integer.parseInt(date1[2]);
      
      String[] date2 = h2.datum.split("[.]");
      int d2 = Integer.parseInt(date2[0]);
      int m2 = Integer.parseInt(date2[1]);
      int y2 = Integer.parseInt(date2[2]);
      
      if (y1 > y2) {
        return 1;
      } else if (y1 < y2) {
        return -1;
      } else {
        
        if (m1 > m2) {
          return 1;
        } else if (m1 < m2) {
          return -1;
        } else {
          
          if (d1 > d2) {
            return 1;
          } else if (d1 < d2) {
            return -1;
          } else {
            return 0;
          }
          
        }
        
      }
    }
}

Diesen Comparator kannst du anschließend zum Sortieren nutzen:

Collections.sort(hausaufgabenArrayList, new CustomComparator());

regex9  26.02.2018, 01:25

Ich finde so eine Lösung nicht so gut, da sie explizit Strings zerlegt, statt mit den gegebenen Datentypen zu arbeiten. Zumindest könnte die compare-Methode gekürzt werden:

public int compare(Homework homework, Homework otherHomework) {
  String[] date = homework.getDate().split(".");
  String[] otherDate = otherHomework.getDate().split(".");

  for (int i = 2; i >= 0; --i) {
    if (date[i].equals(otherDate[i])) {
      continue;
    }

    int part = Integer.parseInt(date[i]);
    int otherPart = Integer.parseInt(otherDate[i]);
    return part - otherPart;
  }

  return 0;
}
0