提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
用java语言实现两个函数encode()和decode(),分别实现对字符串的变换和复原。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
(1) 若已知字符串的当前字符不是大于0的数字字符,则复制该字符于新字符串中。
(2) 若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中。
(3) 若已知字符串的当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,则将它的后继字符(包括后继字符是一个数字字符)重复复制n+1次到新字符串中。
(4) 若已知字符串的当前字符是下划线’',则将当前字符串变换为用‘\UL’。
(5) 以上述一次变换为一组,在不同组之间另插入一个下划线‘’用于分隔
二、代码如下
代码如下(示例):
条件1、2、4、5都一看就懂,不再描述。关键是3。
条件3解读:
条件:循环到某个字符,能判断出来是数字类型,且大于0,并且后面还有字符(不是最后一个)。
动作:就假设这个字符的大小是n,然后把这个字符后面的字符,复制n+1,放到新的结果里。
package com.example.study_1.ms;
import org.apache.commons.lang3.StringUtils;
/**
* (1) 若已知字符串的当前字符不是大于0的数字字符,则复制该字符于新字符串中。
* (2) 若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中。
* (3) 若已知字符串的当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,
* 则将它的后继字符(包括后继字符是一个数字字符)重复复制n+1次到新字符串中。
* (4) 若已知字符串的当前字符是下划线‘_’,则将当前字符串变换为用‘\UL’。
* (5) 以上述一次变换为一组,在不同组之间另插入一个下划线‘_’用于分隔。
* @author 无奈了啊
*/
public class EnCodeAndDecode {
/**
* 编码
*
* @param str
* @return
*/
public static String encode(String str) {
if (StringUtils.isEmpty(str)) {
return null;
}
//准备工作
char[] chars = str.toCharArray();
StringBuffer stringBuffer = new StringBuffer();
int length = chars.length;
int num = 0;
//遍历集合
for (char aChar : chars) {
num++;
//判断是否是数字
//是数字
if (Character.isDigit(aChar)) {
//条件1
if (aChar <= '0') {
stringBuffer.append(aChar);
stringBuffer.append("_");
continue;
}
//条件2
if (num == length) {
stringBuffer.append(aChar);
}
//条件3
//设该数字字符的面值为n,则将它的后继字符(包括后继字符是一个数字字符)重复复制n+1次到新字符串中。
//条件3解读:就假设这个字符的大小是n,然后把这个字符后面的字符,复制n+1,放到新的结果里
if (aChar > 0 && num < length) {
int n = Integer.parseInt(aChar + "") + 1;
char a = chars[num];
while (n > 0) {
stringBuffer.append(a);
n--;
}
}
} else {
//不是数字
//条件4
if ('_' == aChar) {
stringBuffer.append("\\UL");
} else {
stringBuffer.append(aChar);
}
}
//条件5
if (num < length) {
stringBuffer.append("_");
}
}
return stringBuffer.toString();
}
/**
* 解码
*
* @param enData
* @return
*/
public static String deCode(String enData) {
if (StringUtils.isEmpty(enData)) {
return null;
}
if (enData.indexOf("_") == -1) {
return enData;
}
int num = 0;
StringBuffer data = new StringBuffer();
//分割并循环
for (String str : enData.split("_")) {
if (str.length() == 1) {
data.append(str);
} else {
if (str.length() == 0 || StringUtils.isEmpty(str)) {
num++;
}
if (num > 2) {
data.append(num - 2);
}
num = 0;
if ("\\UL".equals(str)) {
data.append("_");
} else {
int n = str.length() - 1;
data.append(n);
}
}
}
return data.toString();
}
//测试
public static void main(String[] args) {
//444_aaaaa_a_b_\UL_ttt_t_2
String encode = encode("24ab_2t2");
String str = deCode(encode);
//编码后
System.out.println(encode);
//解码后
System.out.println(str);
}
}
三、结果输出如下
总结
提示:轮子很多,能看懂会改就好。有更好方法的请指教。