在Java中对单个字符串进行排序

在Java中对单个字符串进行排序,java,string,sorting,Java,String,Sorting,在java中是否有一种按内容对字符串进行排序的本机方法?例如 String s = "edcba" -> "abcde" toCharArray后跟数组。排序后跟字符串构造函数调用: import java.util.Arrays; public class Test { public static void main(String[] args) { String original = "edcba"; char[] chars =

在java中是否有一种按内容对字符串进行排序的本机方法?例如

String s = "edcba"  ->  "abcde"

toCharArray
后跟
数组。排序
后跟字符串构造函数调用:

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

编辑:正如tackline所指出的,如果字符串包含代理项对或复合字符(重音+e作为单独的字符)等,则此操作将失败。在这一点上,它会变得更加困难。。。希望您不需要:)此外,这只是按序号排序,不考虑大写字母、重音或其他任何内容。

不,没有内置的字符串方法。您可以将其转换为字符数组,使用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é"
  }
}
import java.text.Collator;
导入java.util.array;
导入java.util.Comparator;
导入java.util.Locale;
公开课考试
{
公共静态void main(字符串[]args)
{
Collator-Collator=Collator.getInstance(新语言环境(“fr”、“fr”));
字符串original=“édedcbaáa”;
String[]split=original.split(“”);
数组。排序(拆分、合并);
字符串排序=”;
对于(int i=0;i

请注意,如果它是一个大小写混合的字符串(它将把大写字母放在小写字母之前),它将不会像预期的那样工作。您可以将比较器传递给Sort方法来更改它。

一种更原始的方法,无需使用Sort array.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);
}
publicstaticvoidmain(字符串[]args){
字符串wordSt=“watch”;
char[]word=wordSt.toCharArray();
对于(int i=0;i0;j--){
如果(单词[j]→  → :


在Java 8中,可以通过以下方式完成:

String s = "edcba".chars()
    .sorted()
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    .toString();
使用长度为1的字符串流(未排序字符串中的每个字符都转换为流中的字符串)的稍短的替代方法是:

程序:

  • 首先,将字符串转换为字符数组
  • 然后对字符数组进行排序
  • 将字符数组转换为字符串
  • 打印字符串
  • 代码段:

        String input = "world";
        char[] arr = input.toCharArray();
        Arrays.sort(arr);
        String sorted = new String(arr);
        System.out.println(sorted);
    
    publicstaticvoidmain(字符串[]args){
    String str=“helloword”;
    char[]arr;
    列表l=新的ArrayList();
    对于(int i=0;i
    在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);
        }
    }
    
    import java.util.Scanner;
    公共类分类{
    公共静态字符串排序(字符串s1)
    {
    char ch[]=s1.toCharArray();
    字符串res=“”;
    
    对于(inti=0;i问题:在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);
        }
    }
    


    使用流API并处理Unicode补充字符的解决方案:

    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é"
      }
    }
    
    公共静态字符串排序(最终字符串){
    返回s.代码点()
    .已排序()
    .collect(StringBuilder::new、StringBuilder::appendCodePoint、StringBuilder::append)
    .toString();
    }
    
    正确的方法是对代码点进行排序。不幸的是,没有String.toCodePointArray。(顺便说一句,我们应该按什么顺序排序?)ICU项目描述了一种代码点顺序UTF-16排序方法:。我不认为Arrays.sort会由于范围的定义方式而破坏任何补充字符,但请不要引用我的话。它可能不会破坏任何内容,但如果要考虑大写和重音,排序顺序不是最佳的。此算法我会将“édedcbaáa”排序为“ABCDabcdeé”,而在英语(美国)语言环境中,更希望获得“aAábBcCdDe”。@YiweiG,在这种情况下,答案是:绝对不会。
    排序的
    已经是一个
    字符串
    。调用
    toString()
    该怎么办?@Hengameh:您正在对字符数组进行排序,但忽略了它。您需要
    char[]c=s.tocharray();array.sort(c);String sorted=new String(c);
    FYI:此方法将32位代码点拆分为两个值大于0xFFFF的Unicode字符,从而创建具有无效值的字符串。这对法语来说不是问题,但可能会导致某些地区出现问题。请参阅Character.ishighsrogate(char)不知何故,我认为这可以……除非他想对包含斯瓦希里语的字符串进行排序或其他:)“我认为这可以……除非他想对包含斯瓦希里语的字符串进行排序”--我可以看到标语--Unicode:当你想用一种简单的方法将你的应用程序本地化并翻译成某些语言时。Bzzt.Fail。做得几乎正确意味着你以后几乎没有bug要修复。@Jonas我说,我想,除非OP想指定支持斯瓦希里语是绝对必要的。我甚至更喜欢简单的方法没有区域设置的lution,除非OP声明它是不够的。听说过YAGNI原则吗?这个问题要求使用java中的Native way,而不是使用任何其他排序算法。投票通过是因为它是一个有用的解决方案,而不是因为它是要求的答案。@VikrantGoel“java中的Native way”-这种方法有什么地方不是本机的?我看不到任何第三方要求。是吗?这应该是正确的答案。就像@NickCardoso所说的……没有什么比“java本机方式”更重要了另外一方面,对于插入,sort是n平方。使用Arrays.sort总是有好处的。你需要导入java.util.Arrays;否则它就不起作用了。在其他人发布至少3个相同的结果4年后,添加这个答案有什么意义answers@NickCardoso我真的不记得了,你在问关于我在堆栈溢出的早期阶段发布的一个答案,请告诉我。你真的在等待关于这个问题的解释吗
    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);
    
    }
    
    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);
        }
    }
    
    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);
        }
    }
    
    str.chars().boxed().map(Character::toString).sorted().collect(Collectors.joining())
    
    s.chars().mapToObj(Character::toString).sorted().collect(Collectors.joining())
    
    Arrays.stream(str.split("")).sorted().collect(Collectors.joining())