Java Eigenes Objekt Vergleichbarmachen (Nachricht)?

...komplette Frage anzeigen

3 Antworten

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.

eSpVoLTaGe 17.11.2016, 21:55

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.

0
DreiGegengifts 17.11.2016, 22:00
@eSpVoLTaGe

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?

0
eSpVoLTaGe 17.11.2016, 22:05
@DreiGegengifts

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. ^^

0
DreiGegengifts 17.11.2016, 22:10
@eSpVoLTaGe

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?

0
eSpVoLTaGe 17.11.2016, 22:31
@DreiGegengifts

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ß. :)

0
eSpVoLTaGe 17.11.2016, 22:55
@DreiGegengifts

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! :)

0
eSpVoLTaGe 17.11.2016, 23:13
@eSpVoLTaGe

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

this.datum.get(Calendar.MINUTE);

0

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.

eSpVoLTaGe 17.11.2016, 23:59

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. :)

0
androhecker 18.11.2016, 00:52

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

0

Welches Package/Datentyp nutzt du denn für das Datum 

eSpVoLTaGe 17.11.2016, 21:35

Servus proGM, wie bereits mitgeteilt. Ich habe einen eigenen Datentyp angelegt. Er nennt sich bei mir "Datum".

Ich habe es dir mal hochgeladen, damit du dir das besser vorstellen kannst.

http://www.fotos-hochladen.net/uploads/datumd06qnfj3b2.jpg

0
proGM 17.11.2016, 21:39
@eSpVoLTaGe

Jow schon klar, verstehen lediglich nicht weshalb man sich das Leben unnötig kompliziert macht und nicht die vorhandenen Möglichkeiten ( welche wiederum viel mehr Möglichkeiten bieten) nutzt und sich eine eigene Datumsklasse schreibt.

0
eSpVoLTaGe 17.11.2016, 21:41
@proGM

Mhh... Ich kenne viele Datentypen von JAVA nicht (Die vorgegebenen). Also beispielsweise Date... Habe damit noch keine Erfahrung gesammelt. Ist es damit einfach einfach diese zu sortieren?

Des Weiteren weiß ich ebenfalls nicht, wie ich mit diesem speziellen Datentyp umzugehen habe.


Gruß.

0

Was möchtest Du wissen?