1、保存所有字母并排序

2、保存非字母字符和位置

3、使用StringBuilder 的插入功能插入排序后字母对应的非字母字符

import java.util.*;

public class Main{
public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    while(in.hasNextLine()){
        char[] chars = in.nextLine().toCharArray();
        List<Character> datas = new ArrayList();
        Map<Integer , Character> nLe = new LinkedHashMap();//有序
        int len = chars.length;
        int count = 0;//非字母位置
        for(char c : chars){
            if(!Character.isLetter(c)){
                nLe.put(count,c);//记录非字母字符的位置
            }else{
                datas.add(c);//保存字母字符
            }
            count +=1;
        }
        datas.sort((x,y) -> Character.toLowerCase(x) - Character.toLowerCase(y));//升序排序
        StringBuilder builder = new StringBuilder(len);//组装字符串
        datas.forEach(c ->{builder.append(c);});
        for(Map.Entry<Integer , Character>  entry: nLe.entrySet()){
            int index = entry.getKey();
            char value = entry.getValue();
            builder.insert(index,value);//插入保存的非字母字符
        }
        System.out.println(builder);
    }
    
}
}