码迷,mamicode.com
首页 > 编程语言 > 详细

字符串排序之一

时间:2018-05-31 15:30:42      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:字符串长度   reac   ret   方法   需要   regex   就是   char   reg   

规则 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();
        }


    }
}

 

字符串排序之一

标签:字符串长度   reac   ret   方法   需要   regex   就是   char   reg   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!