SORU
14 EYLÜL 2009, PAZARTESİ


Nasıl birden fazla tür parametreleri ile bir liste sıralama?

Bir sınıf Person adında birden çok özellikleri ile, örneğin:

public class Person {
    private int id;
    private String name, address;
    // Many more properties.
}

Person-çok sayıda nesne ArrayList<Person> saklanır. Birden fazla tür parametreleri tarafından bu liste, ve zaman zaman farklı sıralamak istiyorum. Mesela ben bir kez name göre sıralamak için ve daha sonra address artan azalan ve sadece id azalan tarafından başka bir zaman istiyor.

Ve benim sıralama yöntemleri (yani, Collections.sort(personList, someComparator) kullanmak istiyorum. yaratmak istemiyorum Bunu başaran en zarif çözüm nedir?

CEVAP
14 EYLÜL 2009, PAZARTESİ


Numaralama yaklaşım aslında mantıklı olduğunu düşünüyorum, ama geçiş ifadeleri çok fazla nesne odaklı bir yaklaşım gerekiyor. Düşünün:

enum PersonComparator implements Comparator<Person> {
    ID_SORT {
        public int compare(Person o1, Person o2) {
            return Integer.valueOf(o1.getId()).compareTo(o2.getId());
        }},
    NAME_SORT {
        public int compare(Person o1, Person o2) {
            return o1.getFullName().compareTo(o2.getFullName());
        }};

    public static Comparator<Person> decending(final Comparator<Person> other) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                return -1 * other.compare(o1, o2);
            }
        };
    }

    public static Comparator<Person> getComparator(final PersonComparator... multipleOptions) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                for (PersonComparator option : multipleOptions) {
                    int result = option.compare(o1, o2);
                    if (result != 0) {
                        return result;
                    }
                }
                return 0;
            }
        };
    }
}

Kullanımı (statik alma ile) bir örnek.

public static void main(String[] args) {
    List<Person> list = null;
    Collections.sort(list, decending(getComparator(NAME_SORT, ID_SORT)));
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • Hey Nadine

    Hey Nadine

    24 Kasım 2006
  • Klemens Torggler

    Klemens Torg

    11 Mart 2008