# ArrayList (mit Objekten) sortieren



## ChristianEG (12. Mrz 2010)

Aloha,

ich habe hier ein ArrayList was mit mehreren Objekten des Typs "Buchung" gefülllt ist. Eine Buchung besteht aus Kontonummer, Datum und Betrag.

Kontonummer ist ein String,
Datum ist vom Typ Calendar (DATE,MONTH,YEAR) und
Betrag ist ebenfalls ein String.

Ich möchte nun meine ArrayListe nach Datum sortieren, dazu habe ich mir schon folgenden Thread (und unzählige via Google) http://www.java-forum.org/allgemeine-java-themen/74377-arraylist-datum-sortieren.html angeschaut. Allerdings klappt das so nicht wirklich bei mir. Aktuell haben jetzt bei mir alle Buchungen das gleiche Datum 

Kann mir jemand helfen die compareTo Methode richtig zu setzen, damit mein ArrayList nach Datum sortiert wird?

Liebe Grüße,
Christian


----------



## eRaaaa (12. Mrz 2010)

Calendar hat doch selbst auch eine compareTo..d.h. du müsstest einfach nur so etwas schreiben wie:

[c]return buchung.getDate().compareTo(buchung2.getDate());[/c]


----------



## ChristianEG (12. Mrz 2010)

Hey, vielen dank für den Tipp.

Wie baue ich das korrekt ein?

Habe das mal so versucht:

```
public int compareTo(Buchung b1, Buchung b2) {
	return b1.getDatum().compareTo(b2.getDatum());
    }
```

läuft aber nicht.. :\


----------



## eRaaaa (12. Mrz 2010)

Hat deine Klasse Buchung denn die Methode getDatum() ? 
Also genau kann man da ja jetzt nichts sagen ohne die Klasse "Buchung" zu kennen...
Und wieso ist der Betrag eig. ein String?


----------



## ChristianEG (12. Mrz 2010)

Hier die Klasse im Überblick:


```
private String Buch_Kontonummer;
    private Calendar Buch_Datum;
    private String Buch_Betrag;

    Buchung(String KontoNR, Calendar Buch_date, String Buch_betrag) {
	Buch_Kontonummer = KontoNR;
	Buch_Datum = Buch_date;
	Buch_Betrag = Buch_betrag;
    }

    public String getKontonummer() {
	return Buch_Kontonummer;
    }

    public void setKontonummer(String buch_kontonummer) {
	Buch_Kontonummer = buch_kontonummer;
    }

    public Calendar getDatum() {
	return Buch_Datum;
    }

    public void setDatum(Calendar buch_datum) {
	Buch_Datum = buch_datum;
    }

    public String getBetrag() {
	return Buch_Betrag;
    }

    public void setBetrag(String buch_betrag) {
	Buch_Betrag = buch_betrag;
    }
```

Das der Betrag n String ist.. naja, nicht schön... ich weiß. Da ich allerdings am Anfang eine CSV Datei auslese und anhand des ; Splitte und diese "gesplitteten"-Werte in ein String[] schreibe, habe ich dort bei dem Betrag ein String. Der Betrag ist in der CSV im Format xxx,xx. Danach wandel ich den Betrag in ein Double um und ersetze das , mit einem . um mit den Werten zu rechnen.

Funktioniert also, allerdings klappt das jetzt mit dem Datum nicht, ich kämpfe schon seit Tagen mit dem compareTo Zeugs, hab ewig gecodet damit mein TreeSet keine doppelten Kontonummern annimmt..^^


Achja wenn ich die compareTo methode in der Klasse Buchung einfüge, meckert er rum und will unbedingt folgendes am Ende der Klasse einfügen:


```
@Override
    public int compareTo(Buchung o) {
	// TODO Auto-generated method stub
	return 0;
    }
```


----------



## eRaaaa (12. Mrz 2010)

ChristianEG hat gesagt.:


> Achja wenn ich die compareTo methode in der Klasse Buchung einfüge, meckert er rum und will unbedingt folgendes am Ende der Klasse einfügen:
> 
> 
> ```
> ...


?!?! Wie jetzt? Ja klar, es gibt zwei Wege..entweder du ersterllst eine eigene Klasse die Comparator<Buchung> und somit compare implementiert..oder deine Klasse Buchung implementiert halt "implements Comparable<Buchung" und dann musst du in deine Klasse Buchung eben die compareTo einfügen..wieso? Wo befindet sich denn die compareTo momentan bei dir? Die muss natürlich dann in deine Buchungsklasse !
/edit ach..bei compareTo hast du natürlich nur ein Argument..du musst dann natürlich mit THIS vergleichen...

```
@Override
    public int compareTo(Buchung o) {
	return o.getDatum().compareTo(this.getDatum()); //absteigend
    }
```


----------



## ChristianEG (12. Mrz 2010)

Ja ich glaube ich hab mich falsch ausgedrückt 

Das ist mir bewusst das es die 2- Wege gibt. Ich würde das gerne in meine Klasse Buchung schreiben. Natürlich habe ich im ClassHeader "implements Comparable<Buchung>". Wenn ich jetzt folgenden Code meiner Klasse hinzufüge:


```
public int compareTo(Buchung b1, Buchung b2) {
	return b1.getDatum().compareTo(b2.getDatum());
    }[/Java]

dann  bekomme ich eine Fehlermeldung von Eclipse angezeigt:

[code=Java]The type Buchung must implement the inherited abstract method Comparable<Buchung>.compareTo(Buchung)
```

Als Lösung schlägt Ecplipse vor, folgendes ZUSÄTZLICH in die Klasse zu schreiben:


```
@Override
    public int compareTo(Buchung o) {
	// TODO Auto-generated method stub
	return 0;
    }
```

Allerdings verstehe ich nicht warum!! Sorry wenn ich mich nicht klar ausdrücke momentan, nach 9 Stunden Programmieren bin ich etwas durchn Wind  Hoffe kannst damit was anfangen!



***EDIT

Mit deinem neuen Code für compareTO bekomme ich keine Meldung. Allerdings ist das Datum bei jedem Objekt immernoch gleich.


```
Datum: 13.7.2009 Konto 1001 Betrag: 702,78
Datum: 13.7.2009 Konto 1005 Betrag: -16,27
Datum: 13.7.2009 Konto 1004 Betrag: -586,08
Datum: 13.7.2009 Konto 1010 Betrag: -122,77
Datum: 13.7.2009 Konto 1002 Betrag: 512,54
Datum: 13.7.2009 Konto 1006 Betrag: 402,14
Datum: 13.7.2009 Konto 1005 Betrag: -260,17
```

Als vergleich die originalen Werte:


```
1001;15.01.2009;702,78
1005;20.02.2009;-16,27
1004;30.06.2009;-586,08
1010;16.01.2009;-122,77
1002;21.02.2009;512,54
1006;01.07.2009;402,14
1005;17.01.2009;-260,17
```


----------



## eRaaaa (12. Mrz 2010)

Jajaja, siehe mein edit 

[c]public int compareTo(Buchung o) {[/c] = Comparable
[c]public int compare(Buchung o1, Buchung o2) {[/c]=  externer Comparator


----------



## eRaaaa (12. Mrz 2010)

ChristianEG hat gesagt.:


> Mit deinem neuen Code für compareTO bekomme ich keine Meldung. Allerdings ist das Datum bei jedem Objekt immernoch gleich.
> 
> 
> ```
> ...



Ja, das liegt doch aber nicht an der compareTo oder? Liegt doch wahrscheinlich eher daran, dass die Objekte halt mit diesen Daten erzeugt werden? 


```
class Buchung implements Comparable<Buchung> {
    private String Buch_Kontonummer;
    private Calendar Buch_Datum;
    private String Buch_Betrag;

    Buchung(String KontoNR, Calendar Buch_date, String Buch_betrag) {
	Buch_Kontonummer = KontoNR;
	Buch_Datum = Buch_date;
	Buch_Betrag = Buch_betrag;
    }

    public String getKontonummer() {
	return Buch_Kontonummer;
    }

    public void setKontonummer(String buch_kontonummer) {
	Buch_Kontonummer = buch_kontonummer;
    }

    public Calendar getDatum() {
	return Buch_Datum;
    }

    public void setDatum(Calendar buch_datum) {
	Buch_Datum = buch_datum;
    }

    public String getBetrag() {
	return Buch_Betrag;
    }

    public void setBetrag(String buch_betrag) {
	Buch_Betrag = buch_betrag;
    }

    @Override
    public String toString() {
	return "Buchung [Buch_Betrag=" + Buch_Betrag + ", Buch_Datum="
		+ Buch_Datum.getTime() + ", Buch_Kontonummer="
		+ Buch_Kontonummer + "]";
    }

    @Override
    public int compareTo(Buchung o) {
	return o.getDatum().compareTo(this.getDatum()); // absteigend
    }
    
    public static void main(String[] args) {
	List<Buchung> list = new ArrayList<Buchung>();
	Calendar cal1 = Calendar.getInstance();
	cal1.set(2009, 6, 3);
	Calendar cal2 = Calendar.getInstance();
	cal2.set(2002, 6, 3);
	Calendar cal3 = Calendar.getInstance();
	cal3.set(2011, 6, 3);
	list.add(new Buchung("1234", Calendar.getInstance(), "20.0"));
	list.add(new Buchung("567", cal1, "444"));
	list.add(new Buchung("890", cal2, "11"));
	list.add(new Buchung("1123", cal3, "777"));
	Collections.sort(list);
	for (Buchung buchung : list) {
	    System.out.println(buchung);
	}
    }
}
```

funktioniert bei mir...


----------



## ChristianEG (12. Mrz 2010)

Dann werd ich einen Fehler in meiner Ausgabe haben..

wenn ich das so wie du ausgebe:


```
for (Buchung buchung : list) {
        System.out.println(buchung);
    }
```

kommt nur quark raus.



```
...
drei.Buchung@89ae9e
drei.Buchung@1270b73
drei.Buchung@60aeb0
drei.Buchung@16caf43
drei.Buchung@66848c
drei.Buchung@8813f2
...
```


----------



## eRaaaa (12. Mrz 2010)

weil bei dir 

```
@Override
    public String toString() {
    }
```

fehlt(siehe bei mir) ...ohje, jetzt schweifen wir glaub ich grob vom eigentlichen Thema ab


----------



## ChristianEG (12. Mrz 2010)

Oki. Ausgabe läuft. Aber bei mir unsortiert 


```
Buchung [Buch_Betrag=702,78, Buch_Datum=Thu Aug 13 20:06:45 CEST 2009, Buch_Kontonummer=1001]
Buchung [Buch_Betrag=-16,27, Buch_Datum=Thu Aug 13 20:06:45 CEST 2009, Buch_Kontonummer=1005]
Buchung [Buch_Betrag=-586,08, Buch_Datum=Thu Aug 13 20:06:45 CEST 2009, Buch_Kontonummer=1004]
Buchung [Buch_Betrag=-122,77, Buch_Datum=Thu Aug 13 20:06:45 CEST 2009, Buch_Kontonummer=1010]
```


----------



## eRaaaa (12. Mrz 2010)

naja unsortiert würde ich nicht sagen, sie sind ja alle gleich 
Wie erstellst du denn deine Buchungs-Objekte und vor allem die Calendar-Instanzen?


----------

