在Java中对单个String进行排序

问题

是否有一种本地方法可以通过java中的内容对String进行排序?例如。

String s = "edcba"  ->  "abcde"

#1 热门回答(182 赞)

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

编辑:正如指标所指出的那样,如果字符串包含代理对或确实是复合字符(重音为单独的字符)等,这将失败。此时它会变得更加困难...希望你不需要这个:)此外,这只是按顺序排序,不考虑大写,重音或其他任何因素。


#2 热门回答(47 赞)

没有没有内置的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é"
  }
}

#3 热门回答(24 赞)

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

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

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

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