题解 | #字符串排序#
字符串排序
http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
即,按照字母顺序升序排列,同时,按照输入的先后顺序,除了字母以外的特殊字符位置不变
1 首先,将输入的字符串分成两类,一类是字母,一类是非字母.对字母进行排序, 同时建立一个新串,
遍历原始的字符串,如果是字母,就从排序好的顺序中选取进来添加, 如果是非字母,就直接添加到新串
Scanner sc = new Scanner (System.in); //多组数据分开处理 while (sc.hasNext()){ String str = sc.nextLine(); //考虑将英文字母都抽取出来放集合中,方便排序 List<Character> letter = new ArrayList<>(str.length(Character)); char[] ch = str.toCharArray(); for(char c : ch){ if(Character.isLetter(c)){ letter.add(c);//是英文字母的话,加入到集合中 } } //对集合排序,升序排列 letter.sort(new Comparator<Character>(){ public int compare(Character o1,Character o2){ return Character.toLowerCase(o1)-Character.toLowerCase(o2); } }); //最后对原字符串遍历,是字母,就从排序好的集合中取,非字母,则直接添加,组成新串 StringBuiler sb = new StringBuiler(); for(int i=0,j=0;i<str.length();i++){ if(Character.isLetter(str.chatAt(i))){ sb.append(letter.get(j++));//从排序好的集合中取,只有是字母时才需要向后移动,因此用j变量单独表示集合中的下标移动 }else{ sb.append(str.chatAt(i)); } } //打印新串,结束 System.out.println(sb.toString()); }