2009-02-16 12 views
20

मान लें मैं इस तरह के रूप फू नामक एक उपयोगकर्ता परिभाषित जावा वर्ग है:वर्णानुक्रम से क्रमित करें एक जावा संग्रह अपने सदस्य मदों की 'toString' मूल्य पर आधारित

public class Foo 
{ 

    private String aField; 

    @Override 
    public String toString() 
    { 
     return aField; 
    } 

} 

और इस तरह के रूप में एक संग्रह:

List<Foo> aList; 

मैं जो करना चाहता हूं वह प्रत्येक सदस्य के लौटे '.toString()' मान के आधार पर वर्णानुक्रम सूची को सॉर्ट करना है।

मैंने Collections.sort() विधि का उपयोग करने का प्रयास किया है, लेकिन नतीजा यह नहीं था कि मैं कोशिश कर रहा था। इसे पूरा करने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

17

एपीआई sort(List list, Comparator c) का उपयोग करें जो एक तुलनित्र निर्दिष्ट करता है, और लागू करना आपकी इच्छानुसार है।

वैकल्पिक रूप से, यदि आपको विशेष रूप से किसी सूची की आवश्यकता नहीं है, तो SortedSet का उपयोग करें, वही तुलनाकर्ता के साथ होता है।

1

यदि आप विशिष्ट बिंदुओं पर इसे सॉर्ट करने के बजाय संग्रह को सॉर्ट करना चाहते हैं, तो आप इसे परिभाषित तुलनाकर्ता के साथ ट्रीसेट में डाल सकते हैं। अन्यथा, मैं युवल द्वारा पहले से उल्लिखित Collections.sort विधि का उपयोग करूंगा।

+0

पहले से ही मेरा संदेश SortedSet उल्लेख करने के लिए संपादित;) –

6
public class Foo 
    implements Comparable<Foo> 
{ 

    private String aField; 

    public Foo(String s) 
     { 
     aField=s; 
     } 


    public String getAField() 
     { 
     return aField; 
     } 

    public int compareTo(Foo other) 
     { 
     return getAField().compareTo(other.getAField()); 
     } 


    @Override 
    public String toString() 
    { 
    return getAField(); 
    } 

} 

और फिर

Collections.sort (सूची);

58
Collections.sort(fooList, 
       new Comparator<Foo>() 
       { 
        public int compare(Foo f1, Foo f2) 
        { 
         return f1.toString().compareTo(f2.toString()); 
        }   
       }); 

मानते हैं कि toString कभी शून्य नहीं लौटाता है और सूची में कोई शून्य आइटम नहीं है।

+0

विशेष रूप से इस तुलनाकारी लिखते समय प्रश्नकर्ता बस दोनों के बीच तुलना करना चाहता है अनावश्यक हो सकते हैं टूस्ट्रिंग द्वारा ऑब्जेक्ट्स। ऐसा लगता है कि इस प्रकार की तरह अनावश्यक हो सकता है। –

+0

@ नाथन। हां, जेनेरिक प्रकार को ऑब्जेक्ट से अधिक विशिष्ट होने की आवश्यकता नहीं है। आपको तुलनित्र इनलाइन को परिभाषित करने की आवश्यकता नहीं है जैसा कि मेरे पास है। –

+0

जो लैम्बडा के साथ जावा 8 में भी अच्छा है। –

3

मैं दृढ़ता से सलाह देंगे कि आप केवल डीबगिंग उद्देश्यों के लिए toString उपयोग करने के लिए ... लेकिन ... पर क्या युवाल एक ऊपर लिखा विस्तार करने के लिए ...

 
public class X 
    implements Comparator 
{ 
    public int compare(final Foo a, final Foo b) 
    { 
     return (a.toString().compareTo(b.toString())); 
    } 
} 

हालांकि तुम सच में फू लागू Comarable है या चाहिए एक उचित कंपोज़र लिखें जो टूस्ट्रिंग का उपयोग नहीं करता है।

5

मैं बहुत पियरे के लिए इसी तरह कुछ करना होगा:

public class Foo implements Comparable<Foo> 
{ 
    private String aField; 

    @Override 
    public String toString() 
    { 
     return aField; 
    } 

    public int compareTo(Foo o) 
    { 
     return this.toString().compareTo(o.toString()); 
    } 
} 

फिर, पियरे तरह, मैं Collections.sort(list) का प्रयोग करेंगे के रूप में पियरे पता चलता है।

2

लैम्बडाज आपको लूप या अस्पष्ट आंतरिक कक्षाओं के बिना संग्रहों को क्रमबद्ध करने, फ़िल्टर करने और सामान्य रूप से संग्रहित करने की अनुमति देता है। उदाहरण के लिए छँटाई आप पूछ रहे थे के रूप में यह इस प्रकार प्राप्त किया जा सकता:

http://code.google.com/p/lambdaj/

+0

बहुत बढ़िया, मैंने कभी लैम्बडाज के बारे में नहीं सुना था, लेकिन मैं तुरंत देख सकता हूं कि यह कितना उपयोगी हो सकता है। –

+0

अरे बस आपको यह बताना चाहता था कि मैं एक नई परियोजना में लैम्बडाज का उपयोग कर रहा हूं और यह अच्छी तरह से काम कर रहा है। एक बार फिर धन्यवाद। –

+0

यदि आप एक खुश हैं lambdaj उपयोगकर्ता बहुत अच्छा हो सकता है यदि आप यहां अपने इंप्रेशन जोड़ देंगे। धन्यवाद :) http://code.google.com/p/lambdaj/wiki/WhoIsUsingLambdaj –

14

google-collections यह वास्तव में Ordering साथ आसान बना देता है:

sort(foos, on(Foo.class).toString()); 

आप इसे में रुचि रखते हैं इसे बाहर की जाँच

Collections.sort(list, Ordering.usingToString()); 

एक पूरी तीसरी पार्टी लाइब्रेरी में बस कुछ ऐसा उपयोग करने के लिए ला रहा है जिसे आप कंप्रा का उपयोग करके छोटे से लिख सकते हैं टोर (जैसा कि दूसरों ने प्रदान किया है) सार्थक? नहीं, लेकिन Google संग्रह बहुत अच्छा है, आप इसे अन्य कारणों के समूह के लिए वैसे भी चाहते हैं।

छँटाई के मोर्चे पर, आप भी आसानी से चीजों को पीछे की तरह कर सकते हैं:

Ordering.usingToString().reverse(); 

या तोड़ने के संबंधों:

Ordering.usingToString().compound(someOtherComparator); 

या nulls के साथ सौदा:

Ordering.usingToString().nullsFirst(); 

आदि , लेकिन वहां एक गुच्छा अधिक सामान है (बिल्कुल सॉर्टिंग-संबंधित नहीं, जो वास्तव में अभिव्यक्तिपूर्ण कोड की ओर जाता है। इसकी जांच - पड़ताल करें!

2

जावा 8 संस्करण:

list.sort(Comparator.comparing(Object::toString)); 

या स्ट्रीमिंग:

List<Foo> sortedList = unsortedList 
    .stream() 
    .sorted(Comparator.comparing(Object::toString))) 
    .collect(Collectors.toList()); 
संबंधित मुद्दे