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