01: import java.util.*;
02: 
03: public class Komparatory {
04:     public static void main(String[] args) {
05:         new Komparatory();
06:     }
07: 
08:     Komparatory() {
09:         List<Osoba> lista = new ArrayList<Osoba>();
10:         lista.add(new Osoba("Kasia",1980,165));
11:         lista.add(new Osoba("Basia",1986,171));
12:         lista.add(new Osoba("Kasia",1980,168));
13:         lista.add(new Osoba("Hania",1980,171));
14:         lista.add(new Osoba("Magda",1980,171));
15:         lista.add(new Osoba("Kasia",1980,169));
16:         lista.add(new Osoba("Basia",1979,171));
17:         lista.add(new Osoba("Gosia",1975,171));
18: 
19:         Collections.sort(lista);
20:         piszListe(lista, "Naturalny: imie, wiek, wzrost");
21:         Collections.sort(lista, new Comp1());
22:         piszListe(lista, "Comp1:     wzrost, wiek, imie");
23:         Collections.sort(lista, new Comp2());
24:         piszListe(lista, "Comp2:     wiek, imie, wzrost");
25:     }
26: 
27:     static void piszListe(List lista, String naglowek) {
28:         System.out.println(naglowek);
29:         for (int i = 0; i < lista.size(); i++)
30:             System.out.println(lista.get(i));
31:     }
32: }
33: 
34: class Osoba implements Comparable<Osoba> {
35:     String imie;
36:     int    rok_ur;
37:     int    wzrost;
38: 
39:     Osoba(String i, int r, int w) {
40:         imie   = i;
41:         rok_ur = r;
42:         wzrost = w;
43:     }
44: 
45:     /**
46:      * Porzadek naturalny:
47:      * wedlug imienia, potem wieku, potem wzrostu
48:      */
49:     public int compareTo(Osoba o) {
50:         int k = imie.compareTo(o.imie);
51:         if ( k != 0 ) return k;
52:         k = o.rok_ur - rok_ur;
53:         if ( k != 0 ) return k;
54:         return wzrost - o.wzrost;
55:     }
56: 
57:     public String toString() {
58:         return imie + ", " + (2003-rok_ur) +
59:                " lat, " + wzrost + " cm. wzrostu";
60:     }
61: }
62: 
63: /**
64:  * Komparator 1:
65:  * wedlug wzrostu, potem wieku, potem imienia
66:  */
67: class Comp1 implements Comparator<Osoba> {
68:     public int compare(Osoba o1, Osoba o2) {
69:         int k = o1.wzrost - o2.wzrost;
70:         if ( k != 0 ) return k;
71:         k = o2.rok_ur - o1.rok_ur;
72:         if ( k != 0 ) return k;
73:         return o1.imie.compareTo(o2.imie);
74:     }
75: }
76: 
77: /**
78:  * Komparator 2:
79:  * wedlug wieku, potem imienia, potem wzrostu
80:  */
81: class Comp2 implements Comparator<Osoba> {
82:     public int compare(Osoba o1, Osoba o2) {
83:         int k = o2.rok_ur - o1.rok_ur;
84:         if ( k != 0 ) return k;
85:         k = o1.imie.compareTo(o2.imie);
86:         if ( k != 0 ) return k;
87:         return o1.wzrost-o2.wzrost;
88:     }
89: }