Frage von eSpVoLTaGe, 31

Java Eigenes Objekt Vergleichbarmachen (Nachricht)?

Servus,

ich stehe aktuell vor folgendem Problem.

Ich habe ein eigenes Objekt angelegt. (Nachricht)

Diese Nachricht enthält einen String und ein Datum. Datum ist wieder ein eigenes Objekt und besitzt von mir ein Tag, Monat, Stunde, Minute, Sekunde, Millisekunde.

Jetzt habe ich es soweit geschafft alle wichtigen "Nachrichten" in eine Arraylist zu packen und möchte diese jetzt allerdings nach Monat=>Tag=>Stunde=>Minute=>Sekunde=>Millisekunde sortieren.

Ich weiß das ich dafür einen Konstruktor benötige, allerdings weiß ich nicht ganz wie ich die sortieren soll.

Ich würde mich über konstruktive Lösungen/Lösungsvorschläge freuen.

-Dies ist ein Freizeitprojekt, kein Schulprojekt-

Mit freundlichen Grüßen.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von DreiGegengifts, 18

Sortieren kann man auf ganz unterschiedliche Art. Grundsätzlich kann man es elegant über entsprechende Unterstützung durch Java oder selbst Hand anlegen, in dem man eine eigene Sortierungslogik schreibt.

Mit Java Unterstützung kannst du z.B. auf der ArrayList die sort Methode aufrufen um zu sortieren. Damit der dann auch richtig sortiert, muss die Datumsklasse das Interface Comparable mit der Methode compareTo implementieren.

Die Sort Methode ruft dann intern genau diese compareTo Methode deiner Datumsklasse auf und entscheidet je nach dem was du da zurückgibst, ob das übergebene Objekt größer, kleiner oder gleich dem jeweiligen Objekt ist, in der gerade diese Methode durchlaufen wird.

Kommentar von eSpVoLTaGe ,

Servus,

genau, das ist mir bisher klar. Das wäre eine Möglichkeit, des Weiteren geht es ja auch über einen Komparator.

Wenn ich deine Methode nutze, fehlt mir genau die Sortierungslogik. Ich weiß nicht wie ich einen vergleichbaren Wert aus meinem existierenden Datum erzeugen soll um sie zu vergleichen.

Das ganze soll ebenfalls effizient laufen und keine "Jahre" in Anspruch nehmen.

Deswegen überlege ich gerade über die Sortierungslogik nach, wo ich noch keinen Ansatz für habe ODER ob ich einen Datentyp (z.B. Date, wenn es geht) von Java übernehme.

Kommentar von DreiGegengifts ,

Date hat natürlich schon eine ausimplementierte compareTo Methode. Und produktiv würdest du natürlich die Date Klasse von Java nehmen. Aber zum Üben macht es Sinn ruhig mal mit deinem eigenen Objekt zu arbeiten.


Sortierungslogik

Ist dir denn prinzipiell klar, was die compareTo Methode machen soll und  in welchen Fall sie was   zurückgeben muss?

Kommentar von eSpVoLTaGe ,

Servus,

naja... Ich bin der Annahme, das "Verständnis" richtig ist. Eine CompareTo Methode ist dazu da ein Objekt mit einem anderen zu vergleichen und zu bestimmen, welches größer ist.

Generell gebe ich dir Recht.

Danke, ich werde versuchen es mit dem vorgegebenen Date Objekt zu programmieren. Ich denke es ist einfach.

Allerdings verstehe ich nicht welche Daten ich bei einem Date angeben muss und wie die Date-CompareTo Methode  funktioniert... Bzw. was da wie verglichen wird.

Ich hoffe ich konnte mich verständnisvoll ausdrücken. ^^

Kommentar von DreiGegengifts ,

Allerdings verstehe ich nicht welche Daten ich bei einem Date
angeben muss und wie die Date-CompareTo Methode  funktioniert... Bzw. was da wie verglichen wird.

Meinst du jetzt Date von Java oder deine Datumsklasse?

Kommentar von eSpVoLTaGe ,

Ich meine die Date Klasse von Java. Allerdings habe ich gerade gesehen, das diese veraltet ist. Ich nehme jetzt den Calendar. Da sie abstrakt ist, nehme ich GregorianCalendar. :)

Das Ding ist, jetzt habe ich aktuell eine "Nachricht" comparable gemacht und diese anhand vom Datum sortierbar gemacht mit der folgenden:

public int compareTo(Nachricht o) {
if (this.datum.getTime() == null || o.datum.getTime() == null)
return 0;
return this.datum.getTime().compareTo(o.datum.getTime());

Allerdings habe ich jetzt in meiner Mainklasse folgendes Problem.

Wie sage ich jetzt das ich mein unsortiertes Array sortieren möchte?

Ich habe eine Arraylist und jetzt?

list.sort(?????);

Gruß. :)

Kommentar von DreiGegengifts ,

ja genau das wars schon .. alles andere macht die sort Methode dann für dich

Kommentar von eSpVoLTaGe ,

Okay, ich habe es ein wenig ausprobiert.

Ich habe es jetzt über Collections.sort gemacht. Mit Arrays.sort hats nicht funktioniert. Sortiert allerdings trotzdem richtig.

Jetzt habe ich ein Problem bei dem toString von dem Calendar.
Das fehlt nurnoch um mein Programm zu vollendenden.

Wie kann ich aus meinem bestehenden GregorianCalender folgendes Muster erstellen?

01 01 16 14 21

Tag / Monat / Stunde / Minute / Sekunde?

Danke vielmals für die Hilfe, hast mir echt weitergeholfen! :)

Kommentar von eSpVoLTaGe ,

Okay, ich habe es gefunden. Problem ist gelöst. Dankesehr. :)

this.datum.get(Calendar.MINUTE);

Kommentar von androhecker ,

Hier ist die Dokumentation der compareTo Methode: http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-

Diese musst du nicht direkt benutzen, nimm einfach diese Methode aus der Collections Klasse: https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.u...

Antwort
von androhecker, 12

Deine Datum Klasse ist wirklich nicht gerade die beste Umsetzung. Du solltest einfach Java's Date Klasse verwenden. Diese beinhaltet eine long mit den Millisekunden, welche seit dem 1. Januar 1970 vergangen sind. Date ist eine Comparable und kann damit in Listen durch Collections.sort() sortiert werden.

Du kannst auch einfach bei deiner Klasse eine compareTo() Methode schreiben, ist nur etwas aufwendiger, weil du die Teile einzeln speicherst.

Kommentar von eSpVoLTaGe ,

Danke, ich habe das Problem gelöst.

Date habe ich nicht genommen, da  diese Struktur veraltet ist. Ich habe die neue genommen, aber danke  für den Tip. :)

Kommentar von androhecker ,

Du musst dabei immer beachten, dass Java 7 noch häufig genutzt wird, die neue Date API gibt es erst in Java 8.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten