2010-11-30 10 views
15

मेरे पास ऑब्जेक्ट का ऐरेलिस्ट है। ऑब्जेक्ट में date और value विशेषताएँ हैं। तो मैं वस्तुओं को date पर सॉर्ट करना चाहता हूं, और उसी तारीख में सभी ऑब्जेक्ट्स के लिए मैं उन्हें value पर सॉर्ट करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?एकाधिक गुणों पर एक ArrayList आधार को सॉर्ट करें

उत्तर

20

एक कस्टम Comparator लागू करें, फिर Collections.sort(List, Comparator) का उपयोग करें। यह शायद कुछ इस तरह दिखेगा:

public class FooComparator implements Comparator<Foo> { 
    public int compare(Foo a, Foo b) { 
     int dateComparison = a.date.compareTo(b.date); 
     return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison; 
    } 
} 

Collections.sort(foos, new FooComparator()); 
+2

संभालने 'मान' कुछ वर्ग कि' Comparable' ... – harto

0

वस्तु के वर्ग तुलनीय लागू करता है, तो सब आप ठीक ढंग से पहले दिनांकों तुलना करने के लिए compareTo विधि कोड है क्या करने की जरूरत है, और फिर यदि दिनांक बराबर हैं, मानों की तुलना , और फिर निष्कर्षों के आधार पर उचित int परिणाम वापस कर दें।

+0

या आप को लागू करता है एक तुलनाकारी साथ ऐसा कर सकते है जैसा ऊपर बताया गया है कि यदि आप वर्ग को लागू करने योग्य नहीं बनाना चाहते हैं .... आपकी पसंद। यदि आप एक तुलनाकर्ता का उपयोग करते हैं, तो तुलना विधि उपरोक्त मेरे सुझाव का उपयोग करेगी। –

1

यदि आप चाहते हैं नमूना कोड की तरह कर सकते हैं लग रहा है, तो आपको निम्न का उपयोग करें:

Collections.sort(foos, new Comparator<Foo>{ 
    public int compare(Foo a, Foo b) { 
     int dateComparison = a.date.compareTo(b.date); 
     return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison; 
    } 
}); 
3
public static <T> void sort(List<T> list, final List<Comparator<T>> comparatorList) { 
     if (comparatorList.isEmpty()) {//Always equals, if no Comparator. 
      throw new IllegalArgumentException("comparatorList is empty."); 
     } 
     Comparator<T> comparator = new Comparator<T>() { 
     public int compare(T o1, T o2) { 
       for (Comparator<T> c:comparatorList) { 
        if (c.compare(o1, o2) > 0) { 
        return 1; 
        } else if (c.compare(o1, o2) < 0) { 
        return -1; 
        } 
       } 
       return 0; 
     } 
     }; 
     Collections.sort(list, comparator); 
    } 
+0

अपने स्वयं को लागू करने के बजाय तुलनाकर्ताओं को मर्ज करने के लिए लाइब्रेरी कॉल का उपयोग करने पर विचार करें - अमरूद की 'ऑर्डरिंग' श्रेणी देखें: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect /Ordering.html –

संबंधित मुद्दे