描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 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());
}