华为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<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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值