String字符串处理

问题描述:

      请编写一个程序来处理一个只包含‘0’~‘9’以及‘a’~‘z’这36种ASCII码字符的字符串。你的程序应该对该字符串里的字符重新进行排序,并且把输入的字符串分成多段。

以下是对输出字符串的要求:

  1.  每一段中的字符应该是按照严格的升序。这里的排序标准是按照字符的ASCII码值(例如‘9’大于‘0’,‘z’大于‘a’)
  2.  第2段中的字符必须是第1段中字符的子集(可相同),第3段中的字符必须是第2段中字符的子集,依此类推,第i段的字符必须是第i-1段中字符的子集。
  3.  当输入字符串中含有非法字符(例如不在‘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

  输入字符串非法

 

        

 

 

posted @ 2015-04-24 14:31  One160701  阅读(460)  评论(0编辑  收藏  举报