เรียงลำดับสตริงเดียวใน Java


131

มีวิธีดั้งเดิมในการจัดเรียง String ตามเนื้อหาใน java หรือไม่? เช่น

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

แก้ไข: ตามที่แทคไลน์ชี้ให้เห็นสิ่งนี้จะล้มเหลวหากสตริงมีคู่ตัวแทนหรืออักขระผสม (เน้น + e เป็นอักขระแยก) เป็นต้น ณ จุดนั้นมันจะยากขึ้นมาก ... หวังว่าคุณจะไม่ต้องการสิ่งนี้ :) นอกจากนี้นี่เป็นเพียงการเรียงลำดับตามลำดับโดยไม่ต้องคำนึงถึงตัวพิมพ์ใหญ่สำเนียงหรือสิ่งอื่นใด


2
วิธีที่ถูกต้องคือการเรียงลำดับจุดรหัส น่าเสียดายที่ไม่มี String.toCodePointArray (เราควรเรียงลำดับอะไรเป็น btw?)
Tom Hawtin - แท็กไลน์

1
โครงการห้องไอซียูอธิบายรหัสเพื่อจุด UTF-16 วิธีการเรียงลำดับ: icu-project.org/docs/papers/utf16_code_point_order.html ฉันไม่คิดว่า Arrays.sort จะทำลายอักขระเสริมใด ๆ เนื่องจากวิธีกำหนดช่วง แต่อย่าอ้างถึงฉัน
McDowell

1
มันอาจจะไม่ทำลายอะไรเลย แต่ลำดับการจัดเรียงนั้นไม่เหมาะสมหากคุณต้องการพิจารณาตัวพิมพ์ใหญ่และสำเนียงเช่น อัลกอริทึมนี้จะจัดเรียง "éDedCBcbAàa" เป็น "ABCDabcdeàé" ในขณะที่ภาษาอังกฤษ (สหรัฐอเมริกา) เป็นที่พึงปรารถนามากกว่าที่จะได้รับ "aAàbBcCdDeé"
eljenso

1
@YiweiG และในกรณีนี้คำตอบคือไม่แน่นอน sortedเป็นแล้วString... คุณคาดหวังว่าจะเรียกร้องtoString()ให้ทำอะไร?
Jon Skeet

1
@Hengameh: คุณกำลังจัดเรียงอาร์เรย์อักขระ แต่กลับเพิกเฉย คุณต้องการchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet

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 บิตออกเป็นสอง - อักขระ Unicode ที่มีค่ามากกว่า 0xFFFF สร้างสตริงที่มีค่าไม่ถูกต้อง ไม่ใช่ปัญหาสำหรับภาษาฝรั่งเศส แต่อาจทำให้เกิดปัญหากับบางภาษา
McDowell

ดู Character.isHighSurrogate (ถ่าน)
McDowell

1
ฉันคิดว่าสิ่งนี้จะทำได้ ... เว้นแต่เขาต้องการเรียงลำดับสตริงที่มีภาษาสวาฮิลีหรืออะไรบางอย่าง :)
eljenso

3
"ฉันคิดว่าสิ่งนี้จะทำได้ ... เว้นแต่เขาต้องการจัดเรียง Strings ที่มีภาษาสวาฮิลี" - ฉันเห็นสโลแกน - Unicode: เมื่อคุณต้องการวิธีง่ายๆในการแปลและแปลแอปพลิเคชันของคุณเป็นบางภาษา Bzzt ล้มเหลว. ทำสิ่งที่เกือบวิธีการที่เหมาะสมที่คุณแทบจะไม่ได้มีข้อผิดพลาดในการแก้ไขปัญหาในภายหลัง
Jonas Kölker

@ Jonas ฉันบอกว่าฉันคิดว่าเว้นแต่ OP ต้องการระบุว่าจำเป็นอย่างยิ่งที่จะต้องสนับสนุนภาษาสวาฮิลี ฉันชอบวิธีง่ายๆที่ไม่มีโลแคลอีกครั้งเว้นแต่ OP ระบุว่าไม่เพียงพอ เคยได้ยินหลักการ YAGNI หรือไม่?
eljenso

33

ใน Java 8 สามารถทำได้ด้วย:

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

ทางเลือกที่สั้นกว่าเล็กน้อยซึ่งใช้ได้กับ Stream of Strings ที่มีความยาว 1 ตัว (อักขระแต่ละตัวใน String ที่ไม่เรียงลำดับจะถูกแปลงเป็น String ใน Stream) คือ:

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

@ เดนนิสอันไหนกันแน่และทำไม?
Marcin

บิตแรกที่คุณพยายามจัดเรียงสตริง มันดูดี แต่เมื่อฉันรันกับชุดข้อมูลขนาดใหญ่มันค่อนข้างช้ากว่าเล็กน้อยเมื่อเทียบกับคำตอบของ Jon Skeets
Dennis

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"

อะไรคือประเด็นในการเพิ่มคำตอบนี้ 4 ปีหลังจากที่คนอื่นโพสต์คำตอบที่เหมือนกันอย่างน้อย 3 คำตอบ
Nick Cardoso

1
@NickCardoso ฉันจำไม่ได้จริงๆคุณกำลังถามฉันเกี่ยวกับคำตอบที่ฉันโพสต์ในช่วงแรกของฉันใน Stack Overflow คุณกำลังรอคำอธิบายอยู่หรือไม่?
Maroun

@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
คำถามถามหา Native way ใน java โดยไม่ใช้อัลกอริทึมการเรียงลำดับอื่น ๆ
Vikrant Goel

1
โหวตขึ้นเพราะเป็นวิธีแก้ปัญหาที่มีประโยชน์ไม่ใช่เพราะเป็นคำตอบที่ร้องขอ
คริส

1
@VikrantGoel "วิธีดั้งเดิมใน java" - สิ่งที่ไม่เกี่ยวกับวิธีการนี้คืออะไร? ฉันไม่เห็นข้อกำหนดของบุคคลที่สาม มั้ย?
Nick Cardoso

นี่น่าจะเป็นคำตอบที่ถูกต้อง เช่นเดียวกับที่ @NickCardoso กล่าวว่า ... ไม่มีอะไรเป็น "วิธีดั้งเดิมใน java" มากไปกว่านี้
Mariano Zorrilla

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

โปรดทราบว่าสิ่งนี้จะไม่ทำงานตามที่คาดไว้หากเป็นสตริงกรณีผสม (จะใส่ตัวพิมพ์ใหญ่ก่อนตัวพิมพ์เล็ก) คุณสามารถส่งตัวเปรียบเทียบไปยังวิธีการเรียงลำดับเพื่อเปลี่ยนแปลงได้


1
คุณต้องนำเข้า java.util.Arrays; มิฉะนั้นจะไม่ทำงาน
กระโดด

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 ขวบหรือไม่? ขี้เกียจแค่ไหน.
Nick Cardoso

ฉันไม่รู้ ยกโทษให้ฉัน.
rashedcs

2

คำถาม: เรียงลำดับสตริงใน java

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

โดยไม่ต้องใช้ Collections ใน Java:

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

เอาท์พุท:

ป้อนสตริง ==

การเรียงลำดับ

หลังจากการเรียงลำดับ == ginorst


คุณควรดูอีกครั้งที่> =. เกิดอะไรขึ้นกับ "mnmnmnm" เป็นสตริงของคุณ
Nick Cardoso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.