Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

【1】功能(驼峰转下划线)

  1. 只遍历输入字符串一遍
  2. 能够处理处理连续的大写字母如 HTTP
  3. 首字母可大写可小写
/**
     * 双指针法
     * l之前的表示已经转换过的字符
     * l-r之间的表示需要被转换的单词
     * r之后表示还没有循环到的字符
     *
     * @param s 传入的字符串
     * @return
     */
    public static StringBuilder trans(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        int l = 0;
        int r = 0;
        while (r < s.length()) {
            //如果下一个字符是小写
            if (r + 1 < s.length() && !isUpper(s.charAt(r + 1))) {
                while (true) {
                    r++;
                    if (r == s.length()) {
                        stringBuilder.append(s.substring(l).toLowerCase());
                        return stringBuilder;
                    }
                    if (isUpper(s.charAt(r))) {
                        stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                        l = r;
                        break;
                    }
                }
            } else if (r + 1 < s.length()) {//如果下个字符是连着的大写 如HTTP
                //判断是不是第一个字符,如果不判断则会出现aA 变为aa的情况 而不是a_a
                if (r == 0 && isUpper(s.charAt(r + 1))) {
                    r++;
                    stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                    l = r;
                } else {
                    while (true) {
                        r++;
                        if (r == s.length()) {
                            stringBuilder.append(s.substring(l).toLowerCase());
                            return stringBuilder;
                        }
                        if (!isUpper(s.charAt(r))) {
                            r--;
                            stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                            l = r;
                            break;
                        }
                    }
                }
            } else {//如果是到达最后了
                stringBuilder.append(s.substring(l).toLowerCase());
                r++;
            }
        }
        return stringBuilder;
    }

    public static boolean isUpper(char c) {
        return c >= 'A' && c <= 'Z';
    }

【2】测试用例

		System.out.println(trans(""));
        System.out.println(trans(" "));
        System.out.println(trans("isTrue"));
        System.out.println(trans("myFirstName"));
        System.out.println(trans("OnlineUsers"));
        System.out.println(trans("Address"));
        System.out.println(trans("validHTTPRequest"));
        System.out.println(trans("ValidHTTPSRequestCall"));
        System.out.println(trans("UsingHTTPS"));

输出:


 
is_true
my_first_name
online_users
address
valid_http_request
valid_https_request_call
using_https

【3】如果使用有Bug,欢迎评论区留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值