/*
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对应的大写字母
}
}
Introduction to Java Programming编程题9.11<对字符串中的字符排序(支持大小写混排)>
最新推荐文章于 2017-06-11 14:35:09 发布