# Sortierung einer ArrayList mit Comparator



## bronks (3. Jun 2008)

Hi!

Nehmen wir mal an ich habe mehrere Objekte des Typs Person in einer ArrayList. Diese ArrayList möchte ich aufsteigend nach Wohnort, Nachname und Vorname sortieren. 

Wie muß der Comparator dazu aussehen? Es geht mir darum, zu sehen, wie man nach mehreren Eigenschaften sortiert. Werft mir bitte einfach einen Codeschnipsel hier rein in dem man es sieht.

Danke

Bronks


----------



## SlaterB (3. Jun 2008)

12.4 Vergleichen von Objekten 
http://www.galileocomputing.de/open...12_004.htm#mjaf8d671aa3283d042df48c24f0c0c87b


----------



## tfa (3. Jun 2008)

Wenn du nach mehreren Eigenschaften sortieren willst, kannst du genauso gut mehrmals nach je einer Eigenschaft sortieren (primäres Kriterium zum Schluss). Der Sortieralgorithmus in Collections.sort() ist stabil.
Das ist flexibler, hat aber den Nachteil, dass es X-mal solange dauert, wie ein spezieller Comparator.


----------



## bronks (3. Jun 2008)

Danke für eure Antworten. Leider klappt das nicht so wie ich es verstehe.

Könnte bitte jemand von euch den u.g. Code so vervollständigen, daß die ArrayList nach Ort und Nachname sortiert ist. Es sollte bitte mit Java1.4.2 kompatibel sein.



```
public class PersonDTO {
    
    /**
     * Creates a new instance of PersonDTO
     */
    public PersonDTO(String vorname, String nachname) {
        this.setVorname(vorname);
        this.setNachname(nachname);
    }

    public PersonDTO(String vorname, String nachname, String ort) {
        this.vorname = vorname;
        this.nachname = nachname;
        this.ort = ort;
    }

    private String vorname;
    private String nachname;
    private String ort;
....
          
    
}
```


```
public static void main(String[] args) {
        ArrayList list = new ArrayList();

        list.add(new PersonDTO("Peter", "Müller", "A"));
        list.add(new PersonDTO("Daniel", "Schmidt", "A"));
        list.add(new PersonDTO("Hans", "Glatt", "A"));
        list.add(new PersonDTO("Peter", "Maier", "B"));
        list.add(new PersonDTO("Beatrix", "Müller", "B"));



        Comparator c = new Comparator() { // eigene Vergleichsoperation!

            public int compare(Object arg0, Object arg1) {
                String ort1 = ((PersonDTO) arg0).getOrt();
                String ort2 = ((PersonDTO) arg1).getOrt();
                String nachname1 = ((PersonDTO) arg0).getNachname();
                String nachname2 = ((PersonDTO) arg1).getNachname();

                ??? Was kommt hier rein ???

            }
        };

        Collections.sort(list, c);

        Iterator it = list.iterator();
        while (it.hasNext()) {
            PersonDTO person = (PersonDTO) it.next();

            System.out.println(person.getVorname() + " " + person.getNachname() + " " + person.getOrt());
        }
    }
```


----------



## SlaterB (3. Jun 2008)

du meinst, dass du Code

"wenn ort1 und ort2 unterschiedlich dann ...
sonst vergleiche nachname1 und nachname2"

mit einfachen if/ else und equals nicht selber programmieren kannst?
auch kein Ansatz zumindest die Orte alleine zu vergleichen?

edit: und dabei schon 962 Postings  :shock:


----------



## Niki (3. Jun 2008)

Probiers mal so:

```
public int compare(Object arg0, Object arg1) {
                String ort1 = ((PersonDTO) arg0).getOrt();
                String ort2 = ((PersonDTO) arg1).getOrt();
                String nachname1 = ((PersonDTO) arg0).getNachname();
                String nachname2 = ((PersonDTO) arg1).getNachname();
                String vorname1 = ((PersonDTO) arg0).getVorname();
                String vorname2 = ((PersonDTO) arg1).getVorname();
                
                int ortI = ort1.compareTo(ort2);
                if(ortI == 0){
                  int nachnameI = nachname1.compareTo(nachname2);
                  if(nachnameI == 0){
                    return vorname1.compareTo(vorname2);
                  } else {
                    return nachnameI;
                  }
                } else {
                  return ortI;
                }
            }
```


----------



## bronks (3. Jun 2008)

@Niki:
Danke!



			
				SlaterB hat gesagt.:
			
		

> ... edit: und dabei schon 962 Postings  :shock:


Kann doch mal passieren!?!


----------

