1. 使用list集合来收集字符集合,并且设置排序规则,写入的数据全部都变成小写排序,这样就不会破坏字符是否大写的顺序了
  2. 使用list来装入的是目标字符串的每个字符的排序,但是还有非字符没有写入,此时声明一个StringBuffer对象来收集集合
  3. 遍历目标集合,做如下判断: (1)如果是字母,那么就从list集合中读取出来一个字符,写入到StringBuffer对象中,集合遍历下标+1 (2)如果是非字母,那么就说明是其他的特殊字符,那么就直接写入StringBuffer对象,这样就不会破坏原来字符串的位置了。 例如: bBeTy?u; 此时:排序后的list集合中的数据为 : b B e T u y 使用局部变量j = 0;开始读取list集合,i = 0;开始读取原来字符串s step1:i = 0; s.charAt(0) 此时为'b',是字母,那就从list读取写入结果串,并且j++,i++ step2:i= 1,j = 1,'B'也是字母依次类推 。。。 当i = 5时候,读取到了原来字符串的字符'?',此时判断为非字母,就直接将'?'直接写入结果集合,并且j不改变。


import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class Main{
    public static void sortString(String s){
        List<Character> list = new ArrayList<>();// 将字符串s按照空格分隔然后写入list集合
        StringBuffer res = new StringBuffer();
        for(int i = 0; i < s.length();i++){
            if(Character.isLetter(s.charAt(i)))
                list.add(s.charAt(i));
        }
        // 书写排序规则
        list.sort(new Comparator<Character>() {
            @Override
            public int compare(Character o1, Character o2) {
                return Character.toLowerCase(o1) - Character.toLowerCase(o2);// 根据小写来判断的话,不会破坏字符串输入的前后规则
            }
        });
        // 遍历原来的字符串,形成结果
        for(int i = 0,j = 0; i < s.length();i++){
            // 如果不是字符,那么就直接保存当前的位置
            if(Character.isLetter(s.charAt(i)))
                res.append(list.get(j++));// 如果是字符,那么就将list集合的字符添加进去,否则就添加s字符串的非字符数据
            else res.append(s.charAt(i));
        }
        System.out.println(res);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String target = new String(sc.nextLine());
            sortString(target);
        }
    }
    }