题目描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则1:英文字母从A到Z排列,不区分大小写。
如,输入:Type 输出:epTy
规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入:BabA 输出:aABb
规则3:非英文字母的其它字符保持原来的位置。
如,输入:By?e 输出:Be?y
样例:
输入:
A Famous Saying: Much Ado About Nothing(2012/8).
输出:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
分析:由题意可得,先对字母不区分大小写进行排序,再对相同字母进行下标从小到大排序。创建Pair类(需静态)。排序后,利用StringBuilder,再次遍历原字符串,不是字母直接添加,是字母按排序后顺序逐个添加。
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s="";
while((s=br.readLine())!=null){
ArrayList<Pair> array=new ArrayList();
for(int i=0;i<s.length();i++){
if(is_alf(s.charAt(i))){//英文字符添加进array
array.add(new Pair(s.charAt(i),i));//字符和下标
}
}
Collections.sort(array,new Comparator<Pair>(){
public int compare(Pair first,Pair second){
char temFirst=first.ch;
char temSecond=second.ch;
if(temFirst >= 'A'&&temFirst <= 'Z'){//大写换小写比较
temFirst=(char) (temFirst-'A'+'a');
}
if(temSecond >= 'A'&&temSecond <= 'Z'){//大写换小写比较
temSecond=(char) (temSecond-'A'+'a');
}
if(temFirst!=temSecond){//若字母相同按index比较
return temFirst-temSecond;
}else{
return first.index-second.index;
}
}
});
StringBuilder sb=new StringBuilder();//第二次遍历s,不是字母直接添加,是字母按排序后添加
int index=0;
for(int i=0;i<s.length();i++){
if(is_alf(s.charAt(i))){
sb.append(array.get(index++).ch);
}else{
sb.append(s.charAt(i));
}
}
System.out.println(sb.toString());
}
br.close();
}
public static boolean is_alf(char c){
if(c >= 'a'&&c <= 'z'||c >= 'A'&&c <= 'Z'){
return true;
}else{
return false;
}
}
static class Pair{
char ch;
int index;
public Pair(char ch,int index){
this.ch=ch;
this.index=index;
}
}
}