2012-09-28 21 views
5

मुझे स्ट्रिंग्स की लंबाई से एक लिंक्डलिस्ट की स्ट्रिंग्स को सॉर्ट करने की आवश्यकता है, लेकिन समान लंबाई वाले तारों का क्रम रखना चाहते हैं (लेक्सिकोग्राफिक रूप से क्रमबद्ध नहीं)।LinkedList <String> को कैसे सॉर्ट करें?

का नमूना इनपुट:

this 
is 
just 
a 
test 

का नमूना आउटपुट:

a 
is 
this 
just 
test 

मैं एक Comparable<LinkedList<String>> और एक compareTo विधि के साथ यह करने के लिए कोशिश कर रहा हूँ, लेकिन मैं सही उत्पादन नहीं मिलता है मेरा (अभी भी यह कोषगत सॉर्ट करता)

public class Q3_sorting implements Comparable<LinkedList<String>> { 
    Scanner keyboardScanner = null; 
    LinkedList<String> fileList = new LinkedList<String>(); 

// [...] कुछ कोड यहाँ

public int compareTo(LinkedList<String> o) { 
     // TODO Auto-generated method stub 
     o = fileList; 

     for (int i = 0; i < fileList.size() -1; i++) { 
      if (fileList.get(i).length() == o.get(i+1).length()) { 
       return 0; 
      } 
      if (fileList.get(i).length() > o.get(i+1).length()) { 
       return -1; 
      } 
      if (fileList.get(i).length() < o.get(i+1).length()) { 
       return 1; 
      } 

     } 

मैं तो मेरे मुख्य विधि में
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); का उपयोग करें। मैं तो सूची का प्रिंट आउट ...

लेकिन मैं आउटपुट के रूप में यह मिलता है:

a 
is 
just 
test 
this 

मैं इस समस्या को कैसे सुधार होगा?

उत्तर

3

आप स्ट्रिंग्स की सूची नहीं, तारों को क्रमबद्ध कर रहे हैं।ऐसा करने के लिए, आप इस प्रकार उनकी लंबाई से दो तार की तुलना करने के Comparator<String> परिभाषित करने की जरूरत: सूची सॉर्ट करने के लिए

public class ByLength implements Comparator<String> { 
    @Override 
    public int compare(String a, String b) { 
    return a.length() - b.length(); 
    } 
} 

फिर, आप कॉल करने की आवश्यकता:

Collections.sort(sort.fileList, new ByLength()); 

भी ध्यान रखें कि छँटाई LinkedList बहुत अक्षम है और आपको इसके बजाय ArrayList का उपयोग करना चाहिए।

+0

'Collections.sort' का कोई भी उचित कार्यान्वयन सॉर्ट करने से पहले डेटा को एक सरणी में कॉपी करेगा, और फिर वापस कॉपी करें। हालांकि, 'लिंक्डलिस्ट' आमतौर पर अक्षम है और आमतौर पर इससे बचा जाना चाहिए। –

-1

दुर्भाग्यवश स्ट्रिंग्स में ऐसी संपत्ति नहीं है जो दर्शाती है कि वे एक लिंक की गई सूची में किस स्थिति में हैं। इसलिए आपको एक कस्टम डेटा ऑब्जेक्ट बनाने की आवश्यकता होगी जो उस जानकारी का ट्रैक रखे। लिंक्ड सूची के लिए या तो अपनी खुद की कस्टम सॉर्ट विधि लिखें या संग्रह करें। कलेक्शन() के बजाय कॉल करें।

6

Collections.sort(list, comparator) अधिभार का उपयोग करें। आपको Comparator<String>Comparator<LinkedList<String>> की आवश्यकता नहीं है। ध्यान दें कि Collections.sort का जावडोक एक स्थिर प्रकार की गारंटी देता है (बराबर तारों का क्रम रखें, तुलनित्र के बराबर बराबर बराबर)।

+0

आह, ठीक है। मेरे बारे में कितना बेवकूफ ... धन्यवाद – user1706571

7

आप एक तुलनित्र बनाना चाहिए:

public class Q3_sorting implements Comparator<String> { 
public int compare(String a, String b) { 
return a.length() - b.length(); 
} 

और फिर तरह यह विधि के साथ:

Collections.sort(list, new Q3_sorting()); 

ध्यान दें कि आप क्या करना चाहते हैं प्रकार सूची के अंदर तार है। सूची के एक तुलनित्र को कार्यान्वित करके (या तुलनीय, जैसा कि यह एक ही उद्देश्य पर काम करता है) जो आप JVM को बता रहे हैं वह यह है कि आप विभिन्न सूची की तुलना करना चाहते हैं।

आप वर्ग में एक तुलनात्मक रूप से लागू करने के लिए अपना उद्देश्य भी प्राप्त कर सकते हैं, लेकिन जब तक स्ट्रिंग अंतिम नहीं है तब तक आप विस्तार नहीं कर सकते हैं। इसलिए तुलनात्मक को लागू करने के अलावा कोई अन्य तरीका नहीं है, जो कि भी आसान है :)

+0

'तुलनाकर्ता' का उपयोग 'सूची' कार्यान्वयन, जैसे कि 'ट्रीसेट' और 'ट्रीमैप' के क्रमबद्ध करने के लिए भी किया जा सकता है। – Brian

+0

हां। इसका उपयोग कस्टम उपयोगों के बीच, Arrays उपयोगिता वर्ग के माध्यम से भी सरणी को सॉर्ट करने के लिए किया जा सकता है। – enTropy

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