用Java排序单个字符串


131

有没有一种本地方法可以通过java中的字符串对字符串进行排序?例如

String s = "edcba"  ->  "abcde"

Answers:


215

toCharArray接下来是Arrays.sort一个String构造函数调用:

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。(顺便说一句,我们应该按什么顺序排序?)
汤姆·霍顿-临时公告

1
ICU项目描述了代码点顺序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()它做什么?
乔恩·斯基特

1
@Hengameh:您正在对字符数组进行排序,但随后将其忽略。您想要char[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet 2015年

49

不,没有内置的String方法。您可以将其转换为char数组,使用Arrays.sort对其进行排序,然后将其转换回String。

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位代码点一分为二-Unicode字符,其值大于0xFFFF,从而创建具有无效值的字符串。对于法语来说这不是问题,但可能会在某些地区引起问题。
McDowell

参见Character.isHighSurrogate(char)
McDowell,2009年

1
我以某种方式认为这会做...除非他想对包含斯瓦希里语或其他内容的字符串进行排序:)
eljenso

3
“除非他想对包含Swahili的字符串进行排序,否则我会这么做的。”-我可以看到标语-Unicode:当您需要一种简便的方法来将应用程序本地化和翻译成某些语言时。zz 失败。几乎正确地做事意味着您以后几乎没有错误可以修复。
JonasKölker,2009年

@Jonas我说过,我认为,除非OP希望指定绝对有必要支持斯瓦希里语。我什至更喜欢没有语言环境的简单解决方案,除非OP指出这是不够的。听说过YAGNI原则吗?
eljenso

32

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

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

与长度为一的字符串流(在未排序的字符串中的每个字符都转换为流中的字符串)一起使用的更短的替代方法是:

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

@Dennis到底是哪个,为什么?
Marcin

您尝试对字符串进行排序的第一位。看起来不错,但是当我针对大型数据集运行它时,与Jon Skeets的答案相比,它要慢得多。
丹尼斯,

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年,添加此答案的意义是什么
Nick Cardoso

1
@NickCardoso我真的不记得了,您是在问我关于我在堆栈溢出早期阶段发布的答案的问题。您是否真的在等待对此的解释?
Maroun

@NickCardoso我试图不惜一切为你提供了一个借口。您的评论和不赞成票目前暂时不会改变。那是我四年前决定的,我不知道现在提出这个建议的意义是什么:)
Maroun

16

不使用sort 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
该问题要求在Java中使用本机方式,而不使用任何其他排序算法。
Vikrant Goel 2013年

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

请注意,如果它是大小写混合的String(将大写字母放在小写字母之前),则将无法正常工作。您可以将比较器传递给Sort方法来更改它。


1
您需要导入java.util.Arrays; 否则它将无法正常工作
料斗

3

程序:

  1. 首先将字符串转换为char数组
  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

在Java中不使用Collections:

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”作为字符串会怎样?
尼克·卡多佐
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.