Fajnie można to zrobić wykorzystując wzorzec Composite, robiłem kiedyś na studiach porównywanie osób za pomocą komparatora z możliwością sortowania po kilku atrybutach jednocześnie. Kod jest nieco "studencki" ale może Ci się przyda:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Person {
private String LastName;
private String FirstName;
private String PESEL;
private String City;
private String Street;
private int nr;
public Person(String LastName, String FirstName, String PESEL, String City, String Street, int nr) {
this.LastName = LastName;
this.FirstName = FirstName;
this.PESEL = PESEL;
this.City = City;
this.Street = Street;
this.nr = nr;
}
public String toString() {
return (LastName + "\t" + FirstName + "\t" + PESEL + "\t"+ City + "\t"+Street +"\t"+ nr + "\n");
}
public static class PersonComp implements Comparator<Person> {
private List<Comparator<Person>> _child = new ArrayList<Comparator<Person>> ();
private int wynik = 0;
public void add( int i, Comparator<Person> arg1 ) {
_child.add(i, arg1);
}
@Override
public int compare(Person o1, Person o2) {
for (int i=0; i<_child.size(); i++) {
wynik = _child.get(i).compare(o1, o2);
if (wynik != 0) return wynik;
}
return 0;
}
}
public static class LastName implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.LastName.compareToIgnoreCase(o2.LastName);
}
}
public static class FirstName implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.FirstName.compareToIgnoreCase(o2.FirstName);
}
}
public static class City implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.City.compareToIgnoreCase(o2.City);
}
}
public static class Street implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.Street.compareToIgnoreCase(o2.Street);
}
}
public static class PESEL implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.PESEL.compareToIgnoreCase(o2.PESEL);
}
}
public static class nr implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
if (o1.nr > o2.nr) return 1;
if (o1.nr == o2.nr) return 0;
if (o1.nr < o2.nr) return -1;
return 0;
}
}
}
a tutaj przykład wykorzystania:
import java.util.ArrayList;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
ArrayList<Person> arr = new ArrayList<Person>();
arr.add(new Person("Kowalski", "Jan", "8511030788", "Kraków", "Karmelicka", 15));
arr.add(new Person("Kowalski", "Grzegorz", "8510030788", "Kraków", "Karmelicka", 15));
arr.add(new Person("Nowak", "Jan", "8511030789", "Kraków", "Karmelicka", 16));
arr.add(new Person("Dudek", "Marian", "8609030008", "Poznań", "św. Marcina", 10));
arr.add(new Person("Nowak", "Jan", "7509030008", "Poznań", "św. Marcina", 15));
arr.add(new Person("Wiśniewska", "Justyna", "7001430008", "Poznań", "św. Marcina", 10));
arr.add(new Person("Dudek", "Marian", "8609031111", "Warszawa", "Marszałkowska", 11));
arr.add(new Person("Dudek", "Marian", "8609040008", "Poznań", "św. Marcina", 10));
Person.PersonComp Comparator = new Person.PersonComp();
Comparator.add(0, new Person.LastName());
Comparator.add(1, new Person.FirstName());
Comparator.add(2, new Person.PESEL());
Comparator.add(3, new Person.City());
Comparator.add(4, new Person.Street());
Comparator.add(5, new Person.nr());
System.out.println("Dane nieposortowane:");
for (Person e :arr)
System.out.println(e);
Collections.sort(arr, Comparator);
System.out.println("\nDane posortowane:");
for (Person e :arr)
System.out.println(e);
}
}