字符串排序之一

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y

思路:
用一个list存放字母,用一个TreeMap存放按原来字符串的非字母的index作为key升序与非字母映射;
把非字母(TreeMap)所有元素插入到list中,为了list不发生IndexOutOfBoundsException,TreeMap需要排序(本来想直接new ArrayList<>(字符串长度),还是会发生越界,直接TreeMap排序吧)。

public class StringSort {
    private static String regex = "[a-zA-Z]";

    @Test
    public void testPatten(){
        boolean b = Pattern.matches(regex, "?");
        System.out.println(b);
    }

    public static  void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String str = scanner.nextLine();

            if(str == null || str.equals("")){
                //return ;
                continue;
            }

            List<String> list = new ArrayList<>();//存放字母的值

            //map存放非字母的下标key与非字母的值value.
            //这里使用了TreeMap的排序,匿名类实现的方法就是普通的Integer排序,对map的key进行排序(数组下标),
            //防止将map中的元素按照key(list的下标)插入时发生IndexOutOfBoundsException
            Map<Integer,Character> sortMap = new TreeMap<>(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1.compareTo(o2);//Integer默认的排序就行了
                }
            });
            
            
            for (int i=0; i<str.length(); i++){
                if ( Pattern.matches(regex, str.charAt(i)+"" ) ){
                    list.add(str.charAt(i) + "");//字母
                }else{
                    sortMap.put(i,str.charAt(i));//非字母
                }
            }

            Collections.sort(list, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {


                    //经过处理之后,list中的字符都为字母
                    if (o1.equalsIgnoreCase(o2)) {//o1与o2是大小写关系
                        return 0;//等于
                    } else if (o1.toLowerCase().toCharArray()[0] > o2.toLowerCase().toCharArray()[0]) {
                        //全部转化为小写,再将字符串转化为字符数组,由于只包含一个字符,直接取下标为"0"的元素
                        return 1;//大于

                    } else{// if (o1.toLowerCase().toCharArray()[0] < o2.toLowerCase().toCharArray()[0]) {
                        return -1;//小于
                    }
                }
            });

            sortMap.forEach(
                    (k,v) -> {
                        list.add(k.intValue(),v.charValue()+"");
                    }
            );

            list.forEach(
                    n -> System.out.print(n)
            );
            System.out.println();
        }


    }
}
原文地址:https://www.cnblogs.com/theRhyme/p/9116814.html