জাভাতে একটি স্ট্রিং বাছাই করুন


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);
    }
}

সম্পাদনা: টেকলাইনটি হিসাবে উল্লেখ করা হয়েছে যে স্ট্রিংটিতে সরোগেট জোড় বা প্রকৃত সংমিশ্রিত অক্ষর (অ্যাকসেন্ট + ই পৃথক অক্ষর) ইত্যাদি রয়েছে তবে এটি ব্যর্থ হবে that সেই সময়ে এটি আরও শক্ত হয়ে যায় ... আশা করি আপনার এটির দরকার নেই :) তদতিরিক্ত, এটি কেবল মূলধন, অ্যাকসেন্ট বা অন্য কোনও কিছু আমলে না নিয়ে অর্ডিনাল দ্বারা অর্ডার করছে।


2
সঠিক উপায়টি হ'ল কোড পয়েন্টগুলি বাছাই করা। দুর্ভাগ্যক্রমে কোনও স্ট্রিং. টো কোডোপয়েন্টআরে নেই। (
বিটিডব্লিউ

1
আইসিইউ প্রকল্পটি একটি কোড পয়েন্ট অর্ডার ইউটিএফ -16 সাজানোর পদ্ধতি বর্ণনা করে: আইকু- প্রজেক্ট.আর / ডকস / পেপারস / আইটিফ 16_কোড_পয়েন্ট_র্ডারHtml । আমি মনে করি না অ্যারেস.সোর্ট যেভাবে পরিসীমা নির্ধারণ করা হয়েছে তার কারণে কোনও পরিপূরক চরিত্রকে ধ্বংস করবে, তবে আমাকে উদ্ধৃতি দেবে না।
ম্যাকডোয়েল

1
এটি সম্ভবত কিছু ধ্বংস করবে না, তবে আপনি উদাহরণস্বরূপ বড় হাতের অক্ষর এবং অ্যাকসেন্টগুলিকে বিবেচনা করতে চাইলে সাজানোর ক্রমটি সর্বোত্তম নয়। এই অ্যালগরিদম "edDedCBcbAàa" কে "ABCDabcdeàé" হিসাবে বাছাই করবে, উদাহরণস্বরূপ, ইংরেজিতে (মার্কিন) স্থানীয়ভাবে, "aAàbBcCdDeé" অর্জন করা আরও আকাঙ্ক্ষিত হবে।
এলজেনসো

1
@ আইইউইজি এবং এই ক্ষেত্রে, উত্তরটি হ'ল: অবশ্যই না। sortedইতিমধ্যে একটি String... আপনি toString()এটি করতে কল করার কি আশা করবেন?
জন স্কিটি

1
@ হেনগামেহ: আপনি একটি চরিত্রের অ্যারে বাছাই করছেন, তবে তারপরে এড়িয়ে চলেছেন। আপনি চাইবেনchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
জন স্কিটে

49

না কোনও অন্তর্নির্মিত স্ট্রিং পদ্ধতি নেই। আপনি এটিকে একটি চর অ্যারে রূপান্তর করতে পারেন, অ্যারে.সোর্ট ব্যবহার করে এটি বাছাই করতে পারেন এবং এটিকে আবার স্ট্রিংয়ে রূপান্তর করতে পারেন।

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é"
  }
}

এফওয়াইআই: এই পদ্ধতিটি 32 বিট কোড পয়েন্টগুলিকে দুটিতে বিভক্ত করবে - ইউনিকোড অক্ষর 0xFFFF এর চেয়ে বড় মানের, অবৈধ মানগুলির সাথে স্ট্রিং তৈরি করে। ফরাসিদের জন্য কোনও সমস্যা নয়, তবে কিছু লোকেলের জন্য সমস্যা তৈরি করতে পারে।
ম্যাকডোয়েল

ক্যারেক্টার.আইস হাইগ্রোরোগেট (চর)
ম্যাকডোয়েল

1
কোনওরকমভাবে আমি মনে করি এটি করবে ... যদি না সে সোয়াহিলি বা কিছু যুক্ত স্ট্রিংগুলি বাছাই করতে চায় :)
এলজেনসো

3
"আমি মনে করি এটি করা হবে ... যদি না তিনি সোয়াহিলি সমেত স্ট্রিংগুলি বাছাই করতে চান" - আমি স্লোগানটি দেখতে পাচ্ছি - ইউনিকোড: আপনি যখন কিছু ভাষাতে আপনার অ্যাপ্লিকেশনকে স্থানীয়করণ এবং অনুবাদ করার সহজ উপায় চান । Bzzt। ব্যর্থ হয়। এরকম জিনিস প্রায় ডান মানে কি প্রায় পরে ঠিক করতে একটি বাগ হবে না।
জোনাস কলকার

@ জোনাস আমি বলেছিলাম আমি মনে করি , যদি না ওপি নির্দিষ্ট করে না দেয় যে সোয়াহিলিদের সমর্থন করা একেবারে প্রয়োজনীয়। আমি এমনকি লোকেল ছাড়াই সহজ সমাধানটিকে পছন্দ করি, যদি না ওপি না বলে দেয় যে এটি পর্যাপ্ত নয়। ইয়াগনি নীতির কথা কি কখনও শুনেছেন?
এলজেঞ্জো 15

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
@ নিককার্ডোসো আমি সত্যিই মনে করি না, আপনি স্ট্যাক ওভারফ্লোতে আমার খুব প্রাথমিক পর্যায়ে পোস্ট করা একটি উত্তর সম্পর্কে জিজ্ঞাসা করছেন। আপনি কি সত্যিই এর উপর ব্যাখ্যার জন্য অপেক্ষা করছেন?
মারউন

@ নিককার্ডোসো আমি আপনার পক্ষে মোটেও কোন অজুহাত সরবরাহ করার চেষ্টা করছি না । আপনার মন্তব্য এবং ডাউনভোট, আপাতত কোনও পরিবর্তন করবে না। এটাই আমি চার বছর আগে ঠিক করেছিলাম, এখনই এটিকে সামনে আনার কী দরকার তা আমি দেখতে পাচ্ছি না :)
মেরুন

16

বাছাই অ্যারে.সোর্ট পদ্ধতিটি ব্যবহার না করেই আরও কাঁচা পন্থা। এটি সন্নিবেশ সাজানোর ব্যবহার করছে।

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
@ ভিকারান্টগোয়েল "জাভাতে নেটিভ উপায়" - এই পদ্ধতির স্থানীয় কোনটি নেই? আমি কোনও তৃতীয় পক্ষের প্রয়োজনীয়তা দেখতে পাচ্ছি না। আপনি কি?
নিক কার্ডোসো

এটি সঠিক উত্তর হওয়া উচিত। যেমন @ নিককার্ডোসো বলেছেন ... এর চেয়ে "জাভাতে নেটিভ উপায়" এর চেয়ে বেশি কিছু নেই।
মারিয়ানো জোরিলা

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

দ্রষ্টব্য যে এটি প্রত্যাশার মতো কাজ করবে না যদি এটি মিশ্র কেস স্ট্রিং হয় (এটি ছোট হাতের আগে বড় হাতের অক্ষর রাখবে)। আপনি এটি পরিবর্তন করতে বাছাই পদ্ধতিতে একটি তুলনামূলক পাস করতে পারেন।


1
আপনার java.util.Ararays আমদানি করতে হবে; অন্যথায় এটি কাজ করবে না
ফড়িং

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 বছরের পুরানো কোনও প্রশ্নের সদৃশ উত্তর পোস্ট করছেন? কত অলস।
নিক কার্ডোসো

আমি অজ্ঞ আমাকে ক্ষমা কর.
রাশেদকস

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" দিয়ে কী ঘটে?
নিক কার্ডোসো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.