题解 | #字符串排序#
字符串排序
http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
即,按照字母顺序升序排列,同时,按照输入的先后顺序,除了字母以外的特殊字符位置不变
1 首先,将输入的字符串分成两类,一类是字母,一类是非字母.对字母进行排序, 同时建立一个新串,
遍历原始的字符串,如果是字母,就从排序好的顺序中选取进来添加, 如果是非字母,就直接添加到新串
Scanner sc = new Scanner (System.in);
//多组数据分开处理
while (sc.hasNext()){
String str = sc.nextLine();
//考虑将英文字母都抽取出来放集合中,方便排序
List<Character> letter = new ArrayList<>(str.length(Character));
char[] ch = str.toCharArray();
for(char c : ch){
if(Character.isLetter(c)){
letter.add(c);//是英文字母的话,加入到集合中
}
}
//对集合排序,升序排列
letter.sort(new Comparator<Character>(){
public int compare(Character o1,Character o2){
return Character.toLowerCase(o1)-Character.toLowerCase(o2);
}
});
//最后对原字符串遍历,是字母,就从排序好的集合中取,非字母,则直接添加,组成新串
StringBuiler sb = new StringBuiler();
for(int i=0,j=0;i<str.length();i++){
if(Character.isLetter(str.chatAt(i))){
sb.append(letter.get(j++));//从排序好的集合中取,只有是字母时才需要向后移动,因此用j变量单独表示集合中的下标移动
}else{
sb.append(str.chatAt(i));
}
}
//打印新串,结束
System.out.println(sb.toString());
}
CVTE公司福利 672人发布