字符串排序之一

Posted rhyme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串排序之一相关的知识,希望对你有一定的参考价值。

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


    }
}

 

以上是关于字符串排序之一的主要内容,如果未能解决你的问题,请参考以下文章

如何按严重程度排序分类字符串特征?

使用查找组合框 c# 绑定 Datagridview 多列排序

hihoCoder #1457 : 后缀自动机四·重复旋律7(后缀自动机 + 拓扑排序)

Redis入门指南

如何在C语言中通过查看行中的一个属性对文件的行进行排序?

linux sort命令 实例