जावा में एकल स्ट्रिंग को क्रमबद्ध करें


131

क्या जावा में अपनी सामग्री द्वारा स्ट्रिंग को सॉर्ट करने का एक देशी तरीका है? उदाहरण के लिए

String s = "edcba"  ->  "abcde"

जवाबों:


215

toCharArrayइसके Arrays.sortबाद एक स्ट्रिंग निर्माता द्वारा कॉल किया गया:

import java.util.Arrays;

public class Test
{
    public static void main(String[] args)
    {
        String original = "edcba";
        char[] chars = original.toCharArray();
        Arrays.sort(chars);
        String sorted = new String(chars);
        System.out.println(sorted);
    }
}

संपादित करें: जैसा कि अंक बताते हैं, यह विफल हो जाएगा अगर स्ट्रिंग में सरोगेट जोड़े या वास्तव में समग्र वर्ण (अलग वर्ण के रूप में उच्चारण + ई) शामिल हैं, तो उस बिंदु पर यह बहुत कठिन हो जाता है ... उम्मीद है कि आपको इसकी आवश्यकता नहीं है :) इसके अलावा, यह केवल पूंजीकरण, लहजे या किसी अन्य चीज को ध्यान में रखे बिना, अध्यादेश द्वारा आदेश दे रहा है।


2
सही तरीका कोड बिंदुओं को क्रमबद्ध करना होगा। दुर्भाग्य से कोई String.toCodePointArray नहीं है। (हमें किस आदेश को
छाँटना

1
ICU प्रोजेक्ट कोड पॉइंट ऑर्डर UTF-16 सॉर्ट विधि: icu-project.org/docs/papers/utf16_code_point_order.html का वर्णन करता है । मुझे नहीं लगता कि जिस तरह से सीमाएं परिभाषित की गई हैं, उसके कारण Arrays.sort किसी भी पूरक वर्ण को नष्ट कर देगा, लेकिन मुझे उद्धृत न करें।
मैकडॉवेल

1
यह शायद कुछ भी नष्ट नहीं करेगा, लेकिन यदि आप उदाहरण के लिए अपरकेस और लहजे में लेना चाहते हैं तो सॉर्ट ऑर्डर इष्टतम नहीं है। यह एल्गोरिथ्म "éDedCBcbAàa" को "ABCDabcdeàé" के रूप में क्रमबद्ध करेगा, जबकि, उदाहरण के लिए अंग्रेजी (US) लोकेल में, "aAàbBcCDee" प्राप्त करना अधिक वांछनीय होगा।
एलजेन्सो

1
@ यिवीजी और इस मामले में, जवाब है: निश्चित रूप से नहीं। sortedपहले से ही एक है String... क्या आप toString()इसे करने के लिए कॉल करने की उम्मीद करेंगे ?
जॉन स्कीट

1
@Hengameh: आप एक वर्ण सरणी को सॉर्ट कर रहे हैं, लेकिन फिर इसे अनदेखा कर रहे हैं। आप चाहते हैंchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
जॉन स्कीट

49

नहीं, कोई अंतर्निहित स्ट्रिंग विधि नहीं है। आप इसे एक वर्ण सरणी में परिवर्तित कर सकते हैं, इसे Arrays.sort का उपयोग करके सॉर्ट कर सकते हैं और उस स्ट्रिंग में वापस परिवर्तित कर सकते हैं।

String test= "edcba";
char[] ar = test.toCharArray();
Arrays.sort(ar);
String sorted = String.valueOf(ar);

या, जब आप अपरकेस और उच्चारण पात्रों जैसे स्थानीय-विशिष्ट सामान के साथ सही ढंग से व्यवहार करना चाहते हैं:

import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;

public class Test
{
  public static void main(String[] args)
  {
    Collator collator = Collator.getInstance(new Locale("fr", "FR"));
    String original = "éDedCBcbAàa";
    String[] split = original.split("");
    Arrays.sort(split, collator);
    String sorted = "";
    for (int i = 0; i < split.length; i++)
    {
      sorted += split[i];
    }
    System.out.println(sorted); // "aAàbBcCdDeé"
  }
}

FYI करें: यह विधि दो में 32 बिट कोड अंकों को विभाजित करेगी - 0xFFFF से अधिक मूल्य वाले यूनिकोड वर्ण, अमान्य मानों के साथ तार बनाते हैं। फ्रेंच के लिए एक मुद्दा नहीं है, लेकिन कुछ स्थानों के लिए समस्या हो सकती है।
McDowell

देखें चरित्र .isHighSurrogate (char)
McDowell

1
किसी तरह मुझे लगता है कि यह होगा ... जब तक कि वह स्वाहिली या कुछ के साथ स्ट्रिंग्स
छाँटना

3
"मुझे लगता है कि यह करेगा ... जब तक वह स्वाहिली स्ट्रिंग्स युक्त सॉर्ट करना नहीं चाहता है" - मैं नारा देख सकता हूं - यूनिकोड: जब आप स्थानीयकरण और कुछ भाषाओं में अपने अनुप्रयोगों का अनुवाद करना चाहते हैं। Bzzt। असफल। ऐसा करने से बात लगभग सही साधन आप लगभग बाद में तय करने के लिए एक बग नहीं है।
जोनास कोल्कर

@ जोनास ने कहा कि मुझे लगता है , जब तक कि ओपी यह नहीं बताना चाहता कि यह स्वाहिली का समर्थन करने के लिए बिल्कुल आवश्यक है। मैं भी लोकल के बिना सरल समाधान पसंद करता हूं, फिर से जब तक कि ओपी यह नहीं कहता कि यह पर्याप्त नहीं है। कभी YAGNI सिद्धांत के बारे में सुना है?
eljenso

32

जावा 8 में इसके साथ किया जा सकता है:

String s = "edcba".chars()
    .sorted()
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    .toString();

एक छोटा सा विकल्प जो लंबाई के स्ट्रिंग्स के स्ट्रीम के साथ काम करता है (प्रत्येक स्ट्रिंग में प्रत्येक अक्षर स्ट्रिंग में स्ट्रिंग में बदल जाता है) है:

String sorted =
    Stream.of("edcba".split(""))
        .sorted()
        .collect(Collectors.joining());

@ डेनिस किस पर बिल्कुल और क्यों?
मार्सिन

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

18

वर्ण की सरणी के लिए परिवर्तितक्रमबद्धपरिवर्तित वापस स्ट्रिंग के लिए :

String s = "edcba";
char[] c = s.toCharArray();        // convert to array of chars 
java.util.Arrays.sort(c);          // sort
String newString = new String(c);  // convert back to String
System.out.println(newString);     // "abcde"

अन्य लोगों द्वारा कम से कम 3 समान उत्तरों को पोस्ट करने के 4 साल बाद इस उत्तर को जोड़ने में क्या बात थी
निक कार्डसो

1
@NickCardoso मुझे वास्तव में याद नहीं है, आप मुझसे एक जवाब के बारे में पूछ रहे हैं जिसे मैंने स्टैक ओवरफ्लो पर अपने शुरुआती चरणों में पोस्ट किया था। क्या आप वास्तव में उस पर स्पष्टीकरण की प्रतीक्षा कर रहे हैं?
मारून

@NickCardoso मैं आपके लिए एक बहाना प्रदान करने की कोशिश नहीं कर रहा हूँ । आपकी टिप्पणी, और नीचा दिखाना, अभी के लिए कुछ भी नहीं बदलेगा। यह वही है जो मैंने चार साल पहले तय किया था, मैं नहीं देखता कि अब इसे लाने की क्या बात है :)
Maroun

16

सॉर्ट Arrays.sort विधि का उपयोग किए बिना एक अधिक कच्चा दृष्टिकोण। यह सम्मिलन प्रकार का उपयोग कर रहा है।

public static void main(String[] args){
    String wordSt="watch";
    char[] word=wordSt.toCharArray();

    for(int i=0;i<(word.length-1);i++){
        for(int j=i+1;j>0;j--){
            if(word[j]<word[j-1]){
                char temp=word[j-1];
                word[j-1]=word[j];
                word[j]=temp;
            }
        }
    }
    wordSt=String.valueOf(word);
    System.out.println(wordSt);
}

1
जावा में देशी तरीके के लिए पूछे गए प्रश्न, किसी अन्य छँटाई एल्गोरिथ्म का उपयोग नहीं।
विक्रांत गोयल

1
वोट दिया क्योंकि यह एक उपयोगी समाधान था, इसलिए नहीं कि यह अनुरोधित उत्तर था।
क्रिस

1
@VikrantGoel "जावा में मूल तरीका" - इस दृष्टिकोण के बारे में मूल नहीं है? मैं किसी भी 3 पार्टी आवश्यकताओं को नहीं देखता। क्या आप?
निक कार्डसो

यह सही उत्तर होना चाहिए। जैसे @NickCardoso ने कहा ... इससे अधिक "जावा में मूल निवासी" कुछ भी नहीं है।
मारियानो ज़ोरिल्ला

14
    String a ="dgfa";
    char [] c = a.toCharArray();
    Arrays.sort(c);
    return new String(c);

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


1
आपको java.util.rrays आयात करने की आवश्यकता है; या फिर यह काम नहीं करेगा
हॉपर

3

प्रक्रिया:

  1. सबसे पहले स्ट्रिंग को चार सरणी में बदलें
  2. फिर चरित्र की सरणी को सॉर्ट करें
  3. चरित्र सरणी को स्ट्रिंग में बदलें
  4. स्ट्रिंग प्रिंट करें

सांकेतिक टुकड़ा:

    String input = "world";
    char[] arr = input.toCharArray();
    Arrays.sort(arr);
    String sorted = new String(arr);
    System.out.println(sorted);

क्या यह एक मजाक है? 8 साल पुराने एक प्रश्न के समान उत्तर पोस्ट करना? कितना आलसी है।
निक कार्डसो

मैं अज्ञानी हूं। मुझे माफ़ करदो।
rashedcs

2

प्रश्न: जावा में एक तार को छाँटते हैं

public class SortAStringInJava {
    public static void main(String[] args) {

        String str = "Protijayi";
// Method 1
        str = str.chars() // IntStream
                .sorted().collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();

        System.out.println(str);
        // Method 2
        str = Stream.of(str.split(" ")).sorted().collect(Collectors.joining());
        System.out.println(str);
    }
}

-1
public static void main(String[] args) {
    String str = "helloword";   
    char[] arr;
    List<Character> l = new ArrayList<Character>();
    for (int i = 0; i < str.length(); i++) {
        arr = str.toCharArray();
        l.add(arr[i]);

    }
    Collections.sort(l);
    str = l.toString();
    System.out.println(str);
    str = str.replaceAll("\\[", "").replaceAll("\\]", "")
            .replaceAll("[,]", "");
    System.out.println(str);

}

-2

जावा में संग्रह का उपयोग किए बिना:

import java.util.Scanner;

public class SortingaString {
    public static String Sort(String s1)
    {
        char ch[]=s1.toCharArray();         
        String res=" ";
        
        for(int i=0; i<ch.length ; i++)
        {
            for(int j=i+1;j<ch.length; j++)
            {
                if(ch[i]>=ch[j])
                {
                    char m=ch[i];
                    ch[i]=ch[j];
                    ch[j]=m;
                }
            }
            
            res=res+ch[i];
            
        }

        return res;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter the string");
        
        String s1=sc.next();
        String ans=Sort( s1);
        
        System.out.println("after sorting=="+ans);
    }
}

आउटपुट:

स्ट्रिंग दर्ज करें ==

छंटाई

छँटाई के बाद == जिनोरस्ट


आपको फिर से => देखना चाहिए। आपके स्ट्रिंग के रूप में "mnmnmnm" के साथ क्या होता है?
निक कार्डसो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.