描述 | |
---|---|
知识点 | 字符串,排序 |
运行时间限制 | 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;
}
}