华为OJ--------字符串排序

来源:互联网 发布:d3.js 关系图 圆形 编辑:程序博客网 时间:2024/06/12 01:52

描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则1:英文字母从AZ排列,不区分大小写。

      如,输入:Type 输出:epTy

规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列。

    如,输入:BabA 输出:aABb

规则3:非英文字母的其它字符保持原来的位置。

    如,输入:By?e 输出:Be?y

样例:

    输入:

   A Famous Saying: Much Ado About Nothing(2012/8).

    输出:

   A aaAAbc dFgghhiimM nNn oooos Sttuuuy (2012/8).

知识点字符串,排序运行时间限制10M内存限制128输入


输出


样例输入A Famous Saying: Much Ado About Nothing (2012/8).样例输出A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).




/*  * 思路:1、由于只需要排序英文字母,其它字符都按原顺序排列,所以定义一个数组存放这些字符,英文字符用其它字符替换作为标记,  *          最后将英文字符排好序后,将英文字符插入这些标记的位置,这样能够保证只排序英文,其它保持原来的顺序;  *     2、对需要排序的英文,将它们先放入一个list集合中,然后按题目要求重写集合的排序方法,这样英文字母能按要求排序  * */  import java.util.ArrayList;  import java.util.Collections;  import java.util.Comparator;  import java.util.List;  import java.util.Scanner;  import java.util.regex.Matcher;  import java.util.regex.Pattern;    public class Main implements Comparator<String> {      public static void main(String[] args) {          Scanner sc = new Scanner(System.in);          String input = sc.nextLine();          sc.close();          System.out.println(sortString(input));      }        private static String sortString(String input) {          Pattern pattern = Pattern.compile("[a-zA-Z]");          Matcher matcher;          List<String> list = new ArrayList<String>();          String[] splitStr = input.split(""); //将所有字符都存入splitStr数组          for (int i = 1; i < splitStr.length; i++) { //循环遍历每一个字符              matcher = pattern.matcher(splitStr[i]);                if (matcher.matches()) {     //如果该字符是英文字符                  list.add(splitStr[i]);   //将该字符存入list集合中                  splitStr[i] = "";        //将该字符替换为空值作为标记                }          }            Collections.sort(list, new Main());  //调用集合中的sort方法将英文字符排序            StringBuilder stb = new StringBuilder();          String temp = "";          int flag = 0;          for (int i = 1; i < splitStr.length; i++) {              if (splitStr[i].equals("")) {  //如果该位置为标记的位置,插入英文字符                  temp = list.get(flag);                  stb.append(temp);   //添加到最后输入的字符中                  flag++;     //list的指针往后走一步              } else {                  stb.append(splitStr[i]);              }          }          return stb.toString();      }        @Override      public int compare(String s1, String s2) { //重写集合中的排序方法,这里要调用Comparator<E>接口才能重写            if (s1.equalsIgnoreCase(s2)) {              return 0;   //忽略大小写比较,相等的返回一个0          } else {              int a = s1.toLowerCase().charAt(0);  //将要比较的两个字符串变成小写再比较              int b = s2.toLowerCase().charAt(0);  //由于都只有一个字符,charAt(0)能取到该字符              if (a < b)    //比较assii码,如果a排在b的前面,返回一个小于0的数,否则返回大于0的数                  return -1;          }          return 1;      }  }  


0 0