Introduction to Java Programming编程题9.11<对字符串中的字符排序(支持大小写混排)>

/*
Enter a string: okwari
aikorw
Enter a string: ALMOSTlovera
aAelLMoOrSTv
Enter a string: BridgeToEternity
BdeeEgiinorrttTy
 */

import java.util.Scanner;

public class StringSort {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter a string: ");
        String s = input.next();

        for (int i = 0; i < s.length(); i++) {
            if (!Character.isLetter(s.charAt(i))) {
                System.out.print("The string must be letters.");
                System.exit(0);
            }
        }

        char[] upOrder = sort(s);
        System.out.println(upOrder);
    }

    public static char[] sort(String s) {
        int[] lowerCase = new int[26]; 
        int[] upperCase = new int[26];
        char[] letters = new char[s.length()]; //存储排好序的字母

        countOccusLetters(lowerCase, upperCase, s); //统计字母a~z及A~Z在字符串s中出现的次数

        int index = 0;
        // index < s.length() && i < 26 可修改为:index < s.length() 或 i < 26
        // 对最终结果均无影响,推荐使用 index < s.length() && i < 26 便于检查Bug。
        for (int i = 0; index < s.length() && i < 26; i++) {
            if (lowerCase[i] == 0) {
                if (upperCase[i] == 0)
                    continue;
                else
                    index = storeUpperLetter(letters, index, upperCase, i);
            } else {
                index = storeLowerLetter(letters, index, lowerCase, i);
                if (upperCase[i] == 0)
                    continue;
                else
                    index = storeUpperLetter(letters, index, upperCase, i);
            }
        }

        return letters;
    }

    public static void countOccusLetters(int[] lowerCase, int[] upperCase, String s) {
        for (int i = 0; i < s.length(); i++) {
            if (Character.isLowerCase(s.charAt(i)))
                lowerCase[s.charAt(i) - 'a']++;
            else
                upperCase[s.charAt(i) - 'A']++;
        }
    }

    public static int storeLowerLetter(char[] letters, int index, int[] le, int n) {
        char ch = digitToLowerChar(n); // 将下标n转换为对应的小写字母
        for (int i = 0; i < le[n]; i++)
            letters[index++] = ch; // 根据小写字母ch在字符串中出现的次数将字母写入letters数组中

        return index;
    }
    public static int storeUpperLetter(char[] letters, int index, int[] le, int n) {
        char ch = digitToUpperChar(n); // 将下标n转换为对应的大写字母
        for (int i = 0; i < le[n]; i++)
            letters[index++] = ch; // 根据大写字母ch在字符串中出现的次数将字母写入letters数组中

        return index;
    }

    public static char digitToLowerChar(int index) {
        return (char) (index + 'a'); // 返回下标为index对应的小写字母
    }
    public static char digitToUpperChar(int index) {
        return (char) (index + 'A'); // 返回下标为index对应的大写字母
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值