15.蓝桥杯2011第八题,对输入的串进行处理

2018-03-14  本文已影响0人  FiveZM

/**

用户输入:
this is a 99cat
则程序输出:
This Is A 99_cat
*/


import java.util.Scanner;
/**
 * 在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下:
    1.把每个单词的首字母变为大写。
    2.把数字与字母之间用下划线字符(_)分开,使得更清晰
    3.把单词中间有多个空格的调整为1个空格。
 */     
public class a8_1 {

    public static void main(String[] args) {
        System.out.println("请输入一串字符");
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        // int N = s.length(); 这里不可以用N来做循环条件,因为这个字符串s是会改变长度的,当有多余的空格时,会删除空格,那么长度会变短
        // 我曾经用for(int i=0;i<N;i++)作循环条件,当把多余空格删除后,字符串长度减少,那么这里的N的长度还是原来的长度,所以
        // 判断条件必须是动态变化的,要用i<s.length();
        for (int i = 0; i < s.length(); i++) {
            // 当第一个字符是小写时,调用方法转为大写,因为第一个字符有点特殊,因为是第一个所以前面并没有角标了,
            // 所以调用的方法为toupper(s,0),参数并不是写i
            if (Character.isLowerCase(s.charAt(0))) {

                s = toupper(s, 0);
            }
            //当i>0,就是存在i-1的元素时,判断第i个元素是否为小写字母并且在i角标的前一个字符是一个空格,那么我们就要把i元素转化为大写字母
            if (i > 0 && Character.isLowerCase(s.charAt(i)) && Character.isWhitespace(s.charAt(i - 1))) {
                s = toupper(s, i);
            }
            //当i>0,就是存在i-1的元素,判断第i个元素是否字母,并且i的前一个字符是数字,那么我们就要在字母和数字之间加上'_'符号
            if (i > 0 && Character.isLetter(s.charAt(i)) && Character.isDigit(s.charAt(i - 1))) {
                s = addSymbol(s, i);
            }
            //当i>0,就是存在i-1的元素,判断第i个元素是否数字,并且i的前一个字符是字母,那么我们就要在数字和字母之间加上'_'符号
            if (i > 0 && Character.isDigit(s.charAt(i)) && Character.isLetter(s.charAt(i - 1))) {
                s = addSymbol(s, i);
            }
            //当i>0,就是存在i-1的元素,判断第i个元素是否为空格,并且i的前一个字符也是空格,那么我们就要去掉一个空格,去掉一个空格之后i前面的元素就不存在了,这时i元素的角标要
            //替代之前空格的角标,所以要i-1
            if (i > 0 && Character.isWhitespace(s.charAt(i)) && Character.isWhitespace(s.charAt(i - 1))) {
                s = deleteWhileSpace(s, i);
                i--;
            }
        }
        System.out.println(s);
    }

    /**
     * 该方法用于删除多余空格 方法思路:讲字符串分成两部分,前和后
     * 将前部分s.substring(0,i)去掉一个多余的空格,那么就取前部分的子字符串s.substring(0,i-1),
     * 再将前部分连接上后部分s.substring(i)
     */
    private static String deleteWhileSpace(String s, int i) {
        s = s.substring(0, i - 1) + s.substring(i);
        return s;
    }

    /**
     * 该方法用于加符号"_" 方法思路:将字符串分成两部分,前和后,在前和后直接加上一个'_' 前部分s.substring(0,i)加上"_" 再加上后部分
     * s.substring(i)
     */
    private static String addSymbol(String s, int i) {
        s = s.substring(0, i) + "_" + s.substring(i);
        return s;
    }

    /**
     * 该方法用于将首字母是小写的字母转换为大写 方法思路:遇到小写字母开头的,将字符串分成三份,前中后,以i为角标,那么前部分为s.substring(0,i)
     * 中部分为我们要转化的小写字母s.substring(i,i+1),将这部分调用toupperCase方法转化为大写
     * 再将后部分s.substring(i+1)连接起来 substring(int begin,int
     * end);方法会返回一个字符串,该字符串是原来字符串的索引begin~end-1,并不包括第end角标的元素
     */
    private static String toupper(String s, int i) {
        s = s.substring(0, i) + s.substring(i, i + 1).toUpperCase() + s.substring(i + 1);
        return s;
    }

}

在网上学习作的笔记,如有侵犯,立即删除
学习来自博客http://blog.csdn.net/lhy_freshman/article/details/53314138

上一篇下一篇

猜你喜欢

热点阅读