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

  • Dopelives

    Dopelives

    30 Temmuz 2009
  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • Tracy Hairston

    Tracy Hairst

    22 Mayıs 2009