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

描述

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

规则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 {  
    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 list = new ArrayList();  
        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接口才能重写  
  
        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;  
    }  
}  


你可能感兴趣的:(华为OJ)