在字符串中按字母顺序排序字符

8

请问有人可以解释一下如何将 String 中的字符按字母表顺序进行排序吗?例如,如果我有字符串"hello",那么排序后应该是"ehllo",但我的代码似乎做错了。

public static void main(String[] args)
    {
        String result = "";
        Scanner kbd = new Scanner(System.in);
        String input = kbd.nextLine();

        for(int i = 1; i < input.length(); i++)
        {
            if(input.charAt(i-1) < input.charAt(i))
                result += input.charAt(i-1);
            //else 
            //  result += input.charAt(i);
        }
        System.out.println(result);
    }


}

1
你的if语句中的比较部分,能否解释一下你认为它在做什么? - Captain Man
1
不要说你的代码“做错了”,你应该编辑你的问题,给出具体的问题。例如,你可以提供一个样例输入,期望的输出和实际得到的输出。 - azurefrog
我认为你只需要看一下这个链接:https://en.wikipedia.org/wiki/Bubble_sort - Keloo
9个回答

21

你可以按照以下步骤操作 -

1. 将你的字符串转换为 char[] 数组。
2. 使用 Arrays.sort() 方法对 char 数组进行排序。

代码片段:

String input = "hello";
char[] charArray = input.toCharArray();
Arrays.sort(charArray);
String sortedString = new String(charArray);
System.out.println(sortedString);  
如果你想使用for循环来对数组进行排序(为了学习目的),你可以使用以下代码片段(但我认为第一个选项是最好的)-
input="hello";
char[] charArray = input.toCharArray();
length = charArray.length();

for(int i=0;i<length;i++){
   for(int j=i+1;j<length;j++){
      if (charArray[j] < charArray[i]) {
          char temp = charArray[i];
          charArray[i]=arr[j];
          charArray[j]=temp;
      }
   }
}

第二个和冒泡排序不是一样的吗? - Priyank Doshi

14

您可以使用Java 8的Stream来对字符串进行排序,如下所示:

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

4

步骤:

  1. 首先将字符串转换为字符数组

  2. 然后对字符数组进行排序

  3. 将字符数组转换为字符串

  4. 打印字符串


代码片段:

 String input = "world";
 char[] arr = input.toCharArray();
 Arrays.sort(arr);
 String sorted = new String(arr);
 System.out.println(sorted);

1
你的for循环从1开始,应该从0开始:
for(int i = 0; i < input.length(); i++){...}

1
排序作为一项任务,其下限为O(n*logn),其中n是要排序的元素数量。这意味着,如果您使用单个循环进行简单操作,则不能保证正确排序。排序中的关键要素是决定按什么排序。在这种情况下,它是按字母顺序排序,如果将每个字符转换为char,则相当于按升序排序,因为char实际上只是机器映射到字符的数字,其中'a' < 'b'。唯一需要注意的问题是混合大小写,因为'z' < 'A'。为了避免这种情况,您可以使用str.tolower()。我建议您也查找一些基本的排序算法。

0
你可以先将字符放入数组中,然后使用 Arrays.sort 进行排序。
Character[] chars = new Character[str.length()];

for (int i = 0; i < chars.length; i++)
    chars[i] = str.charAt(i);

// sort the array
Arrays.sort(chars, new Comparator<Character>() {
    public int compare(Character c1, Character c2) {
        int cmp = Character.compare(
            Character.toLowerCase(c1.charValue()),
            Character.toLowerCase(c2.charValue())
        );
        if (cmp != 0) return cmp;
        return Character.compare(c1.charValue(), c2.charValue());
    }
});

现在使用StringBuilder构建一个字符串。


0

使用两个for循环的最基本和暴力方法: 它对字符串进行排序,但代价是O(n^2)的时间复杂度。

public void stringSort(String str){
        char[] token = str.toCharArray();
        for(int i = 0; i<token.length; i++){
            for(int j = i+1; j<token.length; j++){
                if(token[i] > token[j]){
                    char temp = token[i];
                    token[i] = token[j];
                    token[j] = temp;
                }
            }
        }
        System.out.print(Arrays.toString(token));
    }

0
使用TreeMap数据结构可以在O(n)的时间复杂度内实现字符串中字符的排序顺序。
    Map<Character, Integer> charMap = new TreeMap<>();

    // Count the frequency of each character
    for (char c : str.toCharArray()) {
        charMap.put(c, charMap.getOrDefault(c, 0) + 1);
    }

    StringBuilder sortedString = new StringBuilder();

    // Build the sorted string
    for (Character c : charMap.keySet()) {
        int frequency = charMap.get(c);
        for (int i = 0; i < frequency; i++) {
            sortedString.append(c);
        }
    }
    return sortedString.toString();

-1

公共类 SortCharcterInString {

public static void main(String[] args) {
    String str = "Hello World";
    char[] arr;
    List<Character> L = new ArrayList<Character>();
    for (int i = 0; i < str.length(); i++) {
        arr = str.toLowerCase().toCharArray();
        L.add(arr[i]);

    }
    Collections.sort(L);
    str = L.toString();
    str = str.replaceAll("\\[", "").replaceAll("\\]", "")
            .replaceAll("[,]", "").replaceAll(" ", "");
    System.out.println(str);

}

虽然此代码可以回答问题,但提供关于其如何或为什么解决问题的额外上下文将有助于提高答案的长期价值。 - leopal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接