首先把非字母剔出来,并记录其下标。然后把剩余的字母进行排序,排序后再插入非字母即可。

class CH{
    char ch;
    int index;
    public CH(char ch,int index){
        this.ch = ch;
        this.index = index;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            List<Character> list = new ArrayList<>();
            List<CH> olist = new LinkedList<>();
            char[] chs = s.toCharArray();
            for(int i =0;i<chs.length;++i){
                if(chs[i]>='a'&&chs[i]<='z'||chs[i]>='A'&&chs[i]<='Z'){
                   list.add(chs[i]);
                }
                else olist.add(new CH(chs[i],i));
            }
            Collections.sort(list,new Comparator<Character>(){
                public int compare(Character c1,Character c2){
                    return Character.toLowerCase(c1)-Character.toLowerCase(c2);
                }
            });
            while(olist.size()!=0){
                CH obj= olist.get(0);
                olist.remove(0);
                list.add(obj.index,obj.ch);
            }
            for(Character cha:list){
                System.out.print(cha);
            }
        }
    }
}