1>题目描述
题目描述:
编写一个程序,将输入字符串中的字符按如下规则排序。 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
规则 3 :非英文字母的其它字符保持原来的位置。
注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行) 输入描述:
输出描述:
输出字符串
2>解法一
1>将字符以及其对应的索引导入map中,将字符中所有的字母导出,利用桶排序的思路,排序字母。 2>看排序完成之后,在进入Map中判断当前索引对应的字符是否为字母,如果是字母,则导出排序完成的字母。
2.1、代码实现
import java. util. *;
public class Main {
public static void main ( String[ ] args) {
Scanner sc = new Scanner ( System. in) ;
while ( sc. hasNextLine ( ) ) {
String s = sc. nextLine ( ) ;
getString ( s) ;
}
}
public static void getString ( String s) {
char [ ] [ ] bucket = new char [ 26 ] [ s. length ( ) ] ;
int [ ] bucketNum = new int [ 26 ] ;
Map< Integer, Character> map = new LinkedHashMap < > ( ) ;
List< Character> list = new ArrayList < > ( ) ;
for ( int i = 0 ; i < s. length ( ) ; i++ ) {
char c1 = s. charAt ( i) ;
map. put ( i, c1) ;
}
for ( int j = 0 ; j < s. length ( ) ; j++ ) {
char c2 = s. charAt ( j) ;
if ( Character. isLowerCase ( c2) ) {
bucket[ c2 - 'a' ] [ bucketNum[ c2 - 'a' ] ] = c2;
bucketNum[ c2 - 'a' ] ++ ;
} else if ( Character. isUpperCase ( c2) ) {
bucket[ c2 - 'A' ] [ bucketNum[ c2 - 'A' ] ] = c2;
bucketNum[ c2 - 'A' ] ++ ;
}
}
for ( int x = 0 ; x < bucketNum. length; x++ ) {
for ( int y = 0 ; y < bucketNum[ x] ; y++ ) {
list. add ( bucket[ x] [ y] ) ;
}
}
int index = 0 ;
for ( int w= 0 ; w< map. size ( ) ; w++ ) {
char c = map. get ( w) ;
if ( Character. isLowerCase ( c) || Character. isUpperCase ( c) ) {
map. replace ( w, list. get ( index++ ) ) ;
}
}
StringBuffer sb = new StringBuffer ( ) ;
for (
Integer i: map. keySet ( ) )
{
sb. append ( map. get ( i) ) ;
}
System. out. println ( sb. toString ( ) ) ;
}
}
3>解法二
1>利用list里的sort()方法排列所有字符,但注意需要利用比较器 2>放回时,思路与之前相似,但是这次是对字符数组进行操作的。
3.1、代码实现
import java. util. *;
public class Main {
public static void main ( String[ ] args) {
Scanner in = new Scanner ( System. in) ;
while ( in. hasNext ( ) ) {
String str = in. nextLine ( ) ;
List< Character> list = new LinkedList < Character> ( ) ;
char [ ] ss = str. toCharArray ( ) ;
for ( char c: ss) {
if ( Character. isLetter ( c) )
list. add ( c) ;
}
Collections. sort ( list, new Comparator < Character> ( ) {
@Override
public int compare ( Character o1, Character o2) {
return Character. toLowerCase ( o1) - Character. toLowerCase ( o2) ;
}
} ) ;
StringBuilder sb = new StringBuilder ( ) ;
int totalLen = 0 ;
for ( char temp: ss) {
if ( Character. isLetter ( temp) && totalLen< list. size ( ) ) {
sb. append ( list. get ( totalLen) ) ;
totalLen += 1 ;
} else {
sb. append ( temp) ;
}
}
System. out. println ( sb. toString ( ) ) ;
}
}
}
4>总结
Java中Character类常用的的静态方法:
Character.isDigit(char c) //判断字符c是否是数字字符,如‘1’,‘2’,是则返回true,否则返回false Character.isLowerCase(char c) || Character.isUpperCase(char c) //判断c是否是字母字符,前面LowerCase是小写,后面UpperCase是大写,是返回True,否则返回False Character.isLetterOrDigit(char c) //判断c是否是字母或数字字符,是返回true,否则返回false 还有一个方法要注意一下: Character.isLetter(char c)可以判断这些字符:
UPPERCASE_LETTER LOWERCASE_LETTER TITLECASE_LETTER MODIFIER_LETTER OTHER_LETTER 这些字符除了包含字母之外还包含其他字符! Character.toLowerCase(char c)将字符转换成小写字母 Character.toUpperCase(char c)将字符转换成大写字母