मैं सूची को वर्णानुक्रम में कैसे सॉर्ट कर सकता हूं?


जवाबों:


217

यह मानते हुए कि वे स्ट्रिंग्स हैं, सुविधाजनक स्थैतिक विधि का उपयोग करें sort...

 java.util.Collections.sort(listOfCountryNames)

यदि आपके पास "यूके" जैसे देश के नाम हैं तो वह टूटने वाला है।
टॉम हॉल्टिन

1
इस मामले में, आप एक अतिरिक्त तर्क के रूप में एक तुलनित्र में पारित कर सकते हैं। हालांकि यह तुलनात्मक रूप से दिलचस्प हिस्सा होगा।
थिलो

7
तुलनाकारी = उपयोग java.text.Collator.getInstance implemeting
थिलो

143

संग्रह के साथ समाधान

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

  • सूची बनाएं
  • कुछ देश के नाम जोड़ें
  • उन्हें एक बार सॉर्ट करें
  • उस सूची को फिर कभी न बदलें

तब थिलोस का जवाब यह करने का सबसे अच्छा तरीका होगा। यदि आप इसे टॉम हॉल्टिन से सलाह के साथ जोड़ते हैं - डीललाइन करें , तो आप प्राप्त करें:

java.util.Collections.sort(listOfCountryNames, Collator.getInstance());

ट्रीस्सेट के साथ समाधान

यदि आप निर्णय लेने के लिए स्वतंत्र हैं, और यदि आपका आवेदन अधिक जटिल हो सकता है, तो आप इसके बजाय ट्रीसेट का उपयोग करने के लिए अपना कोड बदल सकते हैं। इस तरह का संग्रह आपकी प्रविष्टियाँ तब सम्मिलित करता है जब उन्हें डाला जाता है। सॉर्ट () को कॉल करने की आवश्यकता नहीं है।

Collection<String> countryNames = 
    new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.

ध्यान दें कि मैं ट्रीसेट को क्यों पसंद करता हूं

इसके कुछ सूक्ष्म, लेकिन महत्वपूर्ण लाभ हैं:

  • यह बस कम है। हालांकि केवल एक लाइन छोटी है।
  • कभी भी चिंता न करें कि यह सूची वास्तव में अभी छांटी गई है क्योंकि एक ट्रीसेट को हमेशा सॉर्ट किया जाता है, चाहे आप कुछ भी करें।
  • आपके पास डुप्लिकेट प्रविष्टियाँ नहीं हो सकती हैं। आपकी स्थिति के आधार पर यह एक समर्थक या एक चोर हो सकता है। यदि आपको डुप्लिकेट की आवश्यकता है, तो अपनी सूची से चिपके रहें।
  • एक अनुभवी प्रोग्रामर देखता है TreeSet<String> countyNamesऔर तुरंत जानता है: यह डुप्लिकेट के बिना स्ट्रिंग्स का एक सॉर्ट किया गया संग्रह है, और मुझे यकीन है कि यह हर पल सच है । एक छोटी सी घोषणा में इतनी जानकारी।
  • कुछ मामलों में वास्तविक प्रदर्शन की जीत। यदि आप एक सूची का उपयोग करते हैं, और बहुत बार मान सम्मिलित करते हैं, और सूची उन सम्मिलन के बीच पढ़ी जा सकती है, तो आपको प्रत्येक प्रविष्टि के बाद सूची को क्रमबद्ध करना होगा। सेट वही करता है, लेकिन यह बहुत तेजी से करता है।

सही कार्य के लिए सही संग्रह का उपयोग करना संक्षिप्त और बग मुक्त कोड लिखने की कुंजी है। यह इस मामले में प्रदर्शनकारी नहीं है, क्योंकि आप सिर्फ एक लाइन बचाते हैं। लेकिन मैंने यह गिनना बंद कर दिया है कि मैं किसी व्यक्ति को सूची का उपयोग करते समय कितनी बार देखता हूं जब वे यह सुनिश्चित करना चाहते हैं कि कोई भी गलतियां नहीं हैं, और फिर स्वयं उस कार्यक्षमता का निर्माण करें। या इससे भी बदतर, दो सूचियों का उपयोग करके जब आपको वास्तव में एक मानचित्र की आवश्यकता होती है।

मुझे गलत न समझें: कलेक्शंस.सॉर्ट का उपयोग करना कोई त्रुटि या दोष नहीं है। लेकिन ऐसे कई मामले हैं जब ट्रीसेट बहुत क्लीनर है।


मुझे ट्रीसेट का उपयोग करने का कोई फायदा नहीं दिखता।
डीजेकेवर्थ

1
खैर ट्रीसेट ने आकस्मिक दोहराव (जो अच्छा या बुरा हो सकता है) से बचा लिया है और यह तेज होना चाहिए (हालांकि इनपुट के आकार को बहुत ज्यादा नहीं दिया गया है) और यह हमेशा सभी इनपुट के बाद छांटे जाने के बजाय क्रमबद्ध होगा (जब तक कि आप प्रत्येक के साथ सूची को क्रमबद्ध न करें। सम्मिलित करें) जो कुछ भी हो सकता है, लेकिन शायद नहीं। इतनी तेजी से ..
टोफूबीर

1
@TofuBeer मैं इसे स्पष्ट कर रहा था जबकि आप भी कर रहे थे। और अगर आप वास्तव में इस बात की परवाह करते हैं कि क्या तेज है, तो stackoverflow.com/questions/168891/…
Lena Schimmel

7
यदि आइटम परस्पर हैं, तो ट्रीसेट सॉर्ट नहीं किया जाएगा।
जोशुआ गोल्डबर्ग

3
@ जोशुआगोल्डबर्ग मुझे लगता है कि यह न केवल अन-सॉर्ट हो जाएगा, बल्कि यह सही तरीके से काम करना भी बंद कर देगा। कम से कम अगर वस्तु का उत्परिवर्तन इसके छँटाई क्रम को प्रभावित करता है। वृक्ष सेट अपने कार्यों को करने के लिए छांटे जा रहे सामानों पर निर्भर करता है (जैसे खोज करना, निकालना, डालना ...)।
लीना शिमेल

28

आप जावा 8 स्ट्रीम या अमरूद का उपयोग करके एक नई छांट प्रति बना सकते हैं:

// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names); 

एक अन्य विकल्प संग्रह API के माध्यम से इन-प्लेस को सॉर्ट करना है:

Collections.sort(names);

28

देर आए दुरुस्त आए! यहां बताया गया है कि हम इसे कैसे कर सकते हैं (केवल उद्देश्य सीखने के लिए) -

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class SoftDrink {
    String name;
    String color;
    int volume; 

    SoftDrink (String name, String color, int volume) {
        this.name = name;
        this.color = color;
        this.volume = volume;
    }
}

public class ListItemComparision {
    public static void main (String...arg) {
        List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
        softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
        softDrinkList .add(new SoftDrink("Fanta",  "ColorTwo", 3));
        softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));       
        softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));

        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //use instanceof to verify the references are indeed of the type in question
                return ((SoftDrink)softDrinkOne).name
                        .compareTo(((SoftDrink)softDrinkTwo).name);
            }
        }); 
        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
        }
        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //comparision for primitive int uses compareTo of the wrapper Integer
                return(new Integer(((SoftDrink)softDrinkOne).volume))
                        .compareTo(((SoftDrink)softDrinkTwo).volume);
            }
        });

        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
        }   
    }
}

4
फिर, यह सब कोड का कोई औचित्य नहीं है जब एक लाइन करेगी। देखें लीना का जवाब
james.garriss

1
यह एक अभ्यास के रूप में काम कर सकता है, लेकिन अगर मैंने कभी भी उत्पादन कोड में देखा, तो मैं इसे कुल्हाड़ी मारूंगा। हाथोंहाथ।
katzenhut

2
@ james.garriss, लीना का जवाब स्ट्रिंग की सरल सूची के लिए था, यह ऑब्जेक्ट की सूची के लिए है जिसमें स्ट्रिंग विशेषता को क्रमबद्ध किया जाना है।
मुनीब मिर्जा

हाँ, वस्तुओं के साथ उत्पादन में काम करने पर यह उत्तर अत्यधिक मददगार होता है। स्ट्रिंग्स की सूची सामान्य नहीं है।
डोमिनिक K


9

के लिए दो तर्क का उपयोग करें Collections.sort। आप एक उपयुक्त चाहते हैं जो Comparatorमामले का उचित व्यवहार करता है (जैसे कि शाब्दिक है, न कि UTF16 ऑर्डरिंग), जैसे कि प्राप्य java.text.Collator.getInstance


9

जब तक आप केवल उच्चारण-मुक्त अंग्रेजी में तार नहीं छांट रहे हैं, आप शायद ए का उपयोग करना चाहते हैं Collator। यह सही ढंग से diacritical मार्क्स को सॉर्ट करेगा, केस और अन्य भाषा-विशिष्ट सामानों को नजरअंदाज कर सकता है:

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));

आप कोलाटर ताकत सेट कर सकते हैं, जेवाडॉक देख सकते हैं।

यहां स्लोवाक के लिए एक उदाहरण दिया गया है कि Šबाद में कहां जाना चाहिए S, लेकिन UTF के Šबाद कहीं है Z:

List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");

Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]

Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]

7

यहाँ तुम क्या देख रहे हो

listOfCountryNames.sort(String::compareToIgnoreCase)

1
Etc è आदि के साथ भाषाओं पर काम नहीं करता है ... आपको पहले लहजे में पट्टी करने की जरूरत है
विंसेंट डी।

5

का उपयोग करके Collections.sort(), हम एक सूची को सॉर्ट कर सकते हैं।

public class EmployeeList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<String> empNames= new ArrayList<String>();

        empNames.add("sudheer");
        empNames.add("kumar");
        empNames.add("surendra");
        empNames.add("kb");

        if(!empNames.isEmpty()){

            for(String emp:empNames){

                System.out.println(emp);
            }

            Collections.sort(empNames);

            System.out.println(empNames);
        }
    }
}

उत्पादन:

sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]

4

अवरोही वर्णमाला:

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);

यह वही है जिसे मैं देख रहा था। सबसे पहले मुझे सूची को AZ में वापस सॉर्ट करने की आवश्यकता है, और फिर तुलना के लिए ZA। अच्छा उत्तर।
जपेस सोफी


0
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
/**
* 
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {

List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
}); 
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/

// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}

}
}
class Employee {
String name;
Employee (String name) {
this.name = name;

}
}

पर क्यों? लीना के उत्तर में कोड की 1 पंक्ति की तुलना में कोड की इन 50 लाइनों का उपयोग करना बेहतर क्यों है?
james.garriss

क्योंकि, निर्दिष्ट तुलनित्र द्वारा प्रेरित आदेश के अनुसार निर्दिष्ट सूची को सॉर्ट करने के लिए सॉर्ट (सूची <टी>, तुलनित्र <? सुपर टी>) विधि का उपयोग किया जाता है। जब आप उनके नाम और उम्र के अनुसार एम्पली की सूची को क्रमबद्ध करना चाहते हैं तो विधि संग्रह सॉर्ट (सूची, तुलनित्र) का उपयोग करें

नहीं, माफ करना, यहाँ कोई प्यार महसूस नहीं कर रहा है। आप एक अलग प्रश्न का उत्तर दे रहे हैं, अर्थात् वस्तुओं की सूची को उनके गुणों के आधार पर क्रमबद्ध कैसे करें। आपका कोड उस उद्देश्य के लिए उपयोगी हो सकता है, लेकिन यह ओपी के प्रश्न के लिए ओवरकिल है। :-(
james.garriss

-12

आप मेरे द्वारा बनाई गई विधि का उपयोग करके देख सकते हैं।

String key- आप चाहते हैं और इस मामले में वर्णानुक्रम में आदेश होगा। बस "एबीसी ..." डाल दिया।

String list[] - कुंजी का उपयोग करके आप जिस सूची को डालना चाहते हैं।

int index - 0 के रूप में सेट, कुंजी के लिए ऑफसेट सेट करेगा।

    public static String[] order(String key, String list[], int index) {
    ArrayList<String> order_List = new ArrayList<String>();
    ArrayList<String> temp_Order_List = null;
    char[] key_char = key.toCharArray();
    for (int offset = 0; offset < key_char.length; offset++) {
        if (key_char.length >= offset + index) {
            String str = (index > 1 ? list[0].substring(0, index - 1) : "")
                    + new String(key_char, offset, 1);
            for (int i = 0; i < list.length; i++) {
                temp_Order_List = new ArrayList<String>();
                for (int k = 0; k < list.length; k++) {
                    if (!order_List.contains(list[k])
                            && !temp_Order_List.contains(list[k])) {
                        if (list[k].equalsIgnoreCase(str))
                            order_List.add(list[k]);
                        else if (list[k].toLowerCase().startsWith(str.toLowerCase())) {
                            temp_Order_List.add(list[k]);

                        }
                    }
                }
                if (temp_Order_List.size() > 0) {
                    if (temp_Order_List.size() > 1) {
                        String[] add = order(key,
                                temp_Order_List.toArray(new String[temp_Order_List
                                        .size()]), index + 1);
                        for (String s : add) {
                            order_List.add(s);
                        }
                    } else {
                        order_List.add(temp_Order_List.get(0));
                    }
                }
            }
        }
    }
    return order_List.toArray(new String[order_List.size()]);
}

32
ज़रूर, java.util.Collections.sort (सूची) का उपयोग करने के लिए अगर मैं कोड की 30 पंक्तियाँ लिख सकता हूँ :)
Jirka

1
यहां इतने नीचे वोट क्यों? क्या किसी ने भी इस कोड को चलाने की कोशिश की है या उपयोग किए गए एल्गोरिदम को समझने की कोशिश कर रहा है?
JBoy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.