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

  • AndyMcMillinTV

    AndyMcMillin

    6 HAZİRAN 2007
  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • Drakinen

    Drakinen

    1 EYLÜL 2008