zoukankan      html  css  js  c++  java
  • 字符串排序之一

    规则 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();
            }
    
    
        }
    }
  • 相关阅读:
    bestcoder 48# wyh2000 and a string problem (水题)
    Install OpenCV3.0 on Eclipse
    sql 优化 -- sql中的自定函数
    java基础知识总结1
    【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)
    ESLint 配置
    Vue命名规范
    在vue中使用jsx语法
    vue中8种组件通信方式, 值得收藏!
    Vue+Express实现登录状态权限控制
  • 原文地址:https://www.cnblogs.com/theRhyme/p/9116814.html
Copyright © 2011-2022 走看看