String字符串处理
问题描述:
请编写一个程序来处理一个只包含‘0’~‘9’以及‘a’~‘z’这36种ASCII码字符的字符串。你的程序应该对该字符串里的字符重新进行排序,并且把输入的字符串分成多段。
以下是对输出字符串的要求:
- 每一段中的字符应该是按照严格的升序。这里的排序标准是按照字符的ASCII码值(例如‘9’大于‘0’,‘z’大于‘a’)
- 第2段中的字符必须是第1段中字符的子集(可相同),第3段中的字符必须是第2段中字符的子集,依此类推,第i段的字符必须是第i-1段中字符的子集。
- 当输入字符串中含有非法字符(例如不在‘0’~‘9’以及‘a’~‘z’之间),你的程序应该输出“输入字符串非法”
输入样例:
aabbccdd
007799aabbccddeeff113355zz
1234.89898
abcdefabcdefabcdefaaaaaaaaaaaaaabbbbbbbddddddee
输出样例:
abcdabcd
013579abcdefz013579abcdefz
输入字符串非法
abcdefabcdefabcdefabdeabdeabdabdabdabdabaaaaaaa
问题分析:
将输入的字符串按规定顺序输出,因Java String类型声明后既不可更改,故可以考虑先将输入字符串转化为字符串数组,然后遍历数组并对单个字符进行处理,最后输出
题目要求——1 字符按升序排列,且数字置于字母前面; 2 字符串分段输出且后面输出的字符为前面输出字符的子集。
考虑从头到尾遍历字符串数组,将各个字符重复出现的次数分别记录至字符统计数组的对应位置,然后遍历字符统计数组,由于字符统计数组按字符升序存储字符串数组,故利用 String API中 append(char ch)函数,将各个计数位置的实际字符加入StringBuffer,每加入一个字符,将字符串统计数组对应位置元素减1,循环操作字符串统计数组直到所有位置字符重复次数均为0,结束操作,返回StringBuffer内容。
1 package edu.fjnu.string.demo.test; 2 3 import java.util.Scanner; 4 5 //字符串处理程序 6 //控制台读入只包含‘0’~‘9’以及‘a’~‘z’这36种ASCII码字符的字符串,对该字符串里的字符重新进行排序,并且把输入的字符串分成多段。 7 // 8 //(1)每一段中的字符应该是按照严格的升序。这里的排序标准是按照字符的ASCII码值(例如‘9’大于‘0’,‘z’大于‘a’) 9 //(2)第2段中的字符必须是第1段中字符的子集(可相同),第3段中的字符必须是第2段中字符的子集,依此类推,第i段的字符必须是第i-1段中字符的子集。 10 //(3)当程序读入非法字符时直接终止 11 public class Tester { 12 13 private final static int[] COUNT_ARRAY = new int[36];// 36种ASCII码字符出现对应个数 14 15 public static void main(String[] args) { 16 17 getCountArray();// 获取字符串 18 reSort(COUNT_ARRAY);// 处理输出 19 20 } 21 22 private static String getString() {// 从控制台输入字符串 23 24 Scanner reader = new Scanner(System.in);// 读入待处理字符串 25 String input = reader.next();// 将字符串转化成字符数组 26 return input; 27 } 28 29 private static void getCountArray() {// 获得字符串数组,遍历数组并将每个字符重复次数存储于字符统计数组中 30 31 char[] Array = getString().toCharArray(); 32 33 for (char c : Array) {// 统计各个字符出现的次数 34 35 if (isNumber(c)) {// 若为数字 36 COUNT_ARRAY[c - '0']++; 37 } else if (isCharacter(c)) {// 若为字符 38 COUNT_ARRAY[c - 'a' + 10]++; 39 } else { 40 System.out.println("输入字符串非法"); 41 System.exit(0); 42 } 43 44 } 45 } 46 47 private static void reSort(int[] arr) {// 按要求处理字符串 48 StringBuffer sb = new StringBuffer(); 49 while (!isAllZero(arr)) { 50 51 for (int i = 0; i < arr.length; i++) { 52 if (arr[i] > 0) { 53 sb.append(getCharacter(i));// 获取第i个位置对应字符 54 arr[i]--; 55 } 56 57 } 58 } 59 System.out.println(sb); 60 61 } 62 63 private static char getCharacter(int i) {// 获取对应位置(0-35)字符处理函数 64 // TODO Auto-generated method stub 65 char a = ' '; 66 if (i >= 0 && i <= 9) 67 a = (char) (i + '0'); 68 if (i >= 10 && i <= 35) 69 a = (char) (i + 'a' - 10); 70 return a; 71 } 72 73 private static boolean isCharacter(char c) {// 判断是否为字符 74 75 if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') 76 return true; 77 return false; 78 } 79 80 private static boolean isNumber(char c) {// 判断是否为数字 81 if (c >= '0' && c <= '9') 82 return true; 83 return false; 84 } 85 86 private static boolean isAllZero(int[] arr) {// 控制数组循环遍历 87 int temp = 0; 88 for (int i = 0; i < arr.length; i++) { 89 if (arr[i] == 0) 90 temp++; 91 } 92 if (temp == arr.length) 93 return true; 94 return false; 95 96 } 97 98 }
运行结果:
输入:
abcdefabcdefabcdefaaaaaaaaaaaaaabbbbbbbddddddee
fadfa1301341
#Rda
输出:
abcdefabcdefabcdefabdeabdeabdabdabdabdabaaaaaaa
0134adf13af1
输入字符串非法