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

2 Antworten

Vom Fragesteller 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());
9

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());
44

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

Java: Wo ist der Fehler?

public class Uebergabe {   
  public static void main (String[] args) {
     System.out.println("Der Parameter war: " + args[0]);   
  } 
}
...zur Frage

Java: Zeichenkette in char[] auf einzelne Zahlen/Buchstaben überprüfen?

Hallo, ich bin Anfänger in Java und will, dass der Benutzer mit dem Scanner einen String bestimmen kann, welcher dann in einer Char-Zeichenkette (also in einem Array) gespeichert wird: habe bisher das:

import java.util.Scanner;
   public class Zeichenkette_Abfragen {
  public static void main(String args[]) {
    Scanner s = new Scanner(System.in);
    String ersteEingabe = s.next(); //String wird bestimmt.
    char[] zeichenkette = ersteEingabe.toCharArray(); //String wird in einen char-Array umgewandelt.
    
    for (int i=0; i<zeichenkette.length; i++) { //For-Schleife
        System.out.println(zeichenkette[i]);
        if (zeichenkette[i].equals("s")){ //Prüft einzelnes Zeichen, ob es einem bestimmten Wert entspricht.
            // macht irgendwas
        }
        else {
            // macht irgendwas
        }
    }
    
 }
}

Also ich kann einzelne Zeichen auslesen(das klappt immerhin C:), ABER ich kann sie nicht überprüfen, ob sie z.B. einem "b" oder "s" entsprechen. Das muss doch irgendwie gehen ?

...zur Frage

Hauptklasse 'JFrame' (Java Eclipse Neon) konnte nicht gefunden werden?

Code :

import javax.swing.JFrame;

public class ShowAFrame {

public static void main(String [] args){
    JFrame myFrame = new JFrame();
    String myTitle = "Leerer Frame";
    myFrame.setSize(200, 300);
    myFrame.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE);
    myFrame.setVisible(true);               
}

}

Wenn ich dann das Programm ausführe erscheint die Fehlermeldung "Hauptklasse 'JFrame' konnte nicht gefunden oder geladen werden." Was kann ich unternehmen?

...zur Frage

Wie kann ich aus einer ArrayList in einer anderen Klasse erben?

Ich habe mit der Hilfe einer Freundin eine Klasse "Hauptstapel" erstellt und diese enthält die 60 Karten (gemischt) in einer ArrayList. Nun wollen wir eine zweite Klasse erstellen ("HandKarten") die vom Hauptstapel erben soll. In dieser Klasse soll auch angegeben werde, dass Karten vom Hauptstapel abgezogen werden, also fünf Karten für jeden Spieler. Ich hatte mir das so vorgestellt, dass man fünf Karten abzieht (.remove) und sie dann der ArrayList mit den Handkarten hinzufügt (.add), aber ich weiß nicht, wie ich das anstellen soll. Leider bin ich auch nur ne Anfängerin, was es mir noch schwieriger macht damit klar zukommen.

So sieht die Klasse Hauptstapel aus:

public class Hauptstapel {

static ArrayList Karten = new ArrayList();

public static void main(String[] args) {

Random rand1 = new Random(); //Neues Random Objekt for (int a= 0; a < 12; a++) { for(int i=1;i<=5;i++) {

Karten.add(i); //Fügt Zufällige Zahl ein }

} Collections.shuffle(Karten);

...zur Frage

Java Variable auf unendlich setzen

Wie kann ich die fettgedruckte Zahl auf unendlich setzten?:


public class TileEntityElectricMFSU {

} package ic2.common;

public class TileEntityElectricMFSU extends TileEntityElectricBlock { public TileEntityElectricMFSU() { super(3, 512, 100000000000000000); }

public String b() { return "MFSU"; } }


Danke im Vorraus

...zur Frage

Wie kann man ein Javaprogramm in der Eingabeaufforderung ausführen lassen?

z.B. dieses hier:

public class Main{
    public static void main(String[] args){
        System.out.println( "Hallo welt");
    }
}
...zur Frage

Was möchtest Du wissen?