Java悬赏问题,Java语言如何展开字符串
String s = "3a11b7cdef2b5e";
转换成
aaabbbbbbbbbbbcccccccdefbbeeeee
这个问题很有趣,忍不住尝试了一把
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) throws Exception{
String s = "3a11b7cdef2b5e";
String regex = "\\d*[a-zA-Z]";
Pattern pattern = Pattern.compile (regex);
Matcher matcher = pattern.matcher (s);
String[] array = new String[0];
while (matcher.find ()){
String[] cloned = new String[array.length + 1];
System.arraycopy (array, 0, cloned, 0, cloned.length - 1);
cloned[cloned.length - 1] = matcher.group ();
array = cloned;
}
StringBuffer sbBuffer=new StringBuffer();
for ( String str2 : array ){
//System.out.println (str2);
String[] strArr=str2.split("[a-zA-Z]");
if(strArr.length==1) {
str2=str2.replace(strArr[0], "");
int i=Integer.parseInt(strArr[0]);
for (int j=0;j<i;j++) {
sbBuffer.append(str2);
}
}else {
sbBuffer.append(str2);
}
}
System.out.println(sbBuffer.toString());//aaabbbbbbbbbbbcccccccdefbbeeeee
}
}
public static String convert(String s) {
StringBuilder stringBuilder = new StringBuilder();
StringBuilder sb = null;
for (int i = 0; i < s.length(); i++) {
if (!Character.isDigit(s.charAt(i))) {
stringBuilder.append(s.charAt(i));
} else {
if (sb == null) {
sb = new StringBuilder();
}
sb.append(s.charAt(i));
if (Character.isDigit(s.charAt(i + 1))) {
continue;
}
}
if (sb != null) {
for (int j = 0; j < Integer.valueOf(sb.toString()) - 1; j++) {
stringBuilder.append(s.charAt(i + 1));
}
}
sb = null;
}
return stringBuilder.toString();
}
解析过程:
字符读取每个字符,校验ASCLL 值,来判断是0-9还是a-z或A-Z;正则表达式校验也行;
读取数字,直至出现英文字符,有多个数字则拼接转换为整形数字,比如11
没有数字直接读取到英文字符,则初始化改字符的个数为1;
有个数有字符了,解析结束后,遍历拼接即可。
或者在解析过程中使用SpringBuffer 直接append 也行
String s="3a11b7cdef2b5e"; //定义字符串
System.out.println(s.length()); //看一下长度啊
String[] s1=new String[s.length()]; //搞个同样长度的String数组
for(int i=0;i<s.length();i++) { //把s切开分给各个数组元素
s1[i]=s.substring(i, i+1);
//System.out.println(s1[i]); //瞅一眼是不是每个元素都分到了
}
for(int j=0;j<s1.length;j++) { //开始遍历,嘿嘿
if(s1[j].matches("[1-9]")) { //拿到1-9之间的字符的元素请出列
int count=Integer.parseInt(s1[j]); //不好意思给你变成int型了
if(s1[j+1].matches("[0-9]")) { //因为没有规定数字必须是10以内的数(0,10),
//所以都要看一下,万一两个数字相邻呢
int count1=Integer.parseInt(s1[j+1]); //相邻,好,转成数字
for(int k=1;k<count*10+count1;k++) { //两个相邻的数字组成一个更牛X的数字(我来组成头部……)
System.out.print(s1[j+2]); //既然前两个相邻,那就输出第三个,以此类推……
}
}else { //既然能走到这,说明相邻的两个元素并不能组成一个两位数,
//那就表示数字元素的下一位一定是非数字
for(int k=1;k<count;k++) { //既然你是非数字,那劳资就不客气了
System.out.print(s1[j+1]); //输出死你!!!
}
}
}else { //走到这了,说明这个元素前一位不是数字
//System.out.print(j);
System.out.print(s1[j]); //原样输出
//***********************我怎么写出了这么烂的代码!!***********************\\
//*******(╯°O°)╯ ┻━┻*******\\
}
}
String str = "3a11b7cdef2b5e";
String stt = "";
for(int i=0; i<str.length();i++){
StringBuffer sBuffer = new StringBuffer("");
if(str.charAt(i)>=48 && str.charAt(i)<=57) { //判断是否是数字
//循环判断是否为数字,是进入while循环体
while((i<str.length() && str.charAt(i)>=48 && str.charAt(i)<=57)) {
sBuffer.append(str.substring(i,i+1));//截取数字并拼加
i++;
}
int num = Integer.parseInt(sBuffer.toString());
for(int j=1;j <= num; j++) {
stt += str.charAt(i);
}
} else {
stt += str.charAt(i);
}
}
System.out.println("Hello, World!"+stt);
代码:
public String collaps(String msg) {
Iterator it = buildIterator(msg);
StringBuilder buffer = initBuffer();
int num = initNum();
while(it.hasNext()) {
char c = (char) it.next();
if (isDigit(c)) {
num = accumulate(num,c);
continue;
}
if (0 == num)
increaseBuffer(buffer,c);
else
for(int i = 0;i<num;i++)
increaseBuffer(buffer,c);
num = initNum();
}//end while
return buffer.toString();
}
private int initNum() {
return 0;
}
private StringBuilder initBuffer() {
return new StringBuilder();
}
private Iterator buildIterator(String msg) {
return new Iterator() {
private char[] array = msg.toCharArray();
private int pos = 0;
public boolean hasNext() { return pos<array.length; }
public Object next() { return array[pos++]; }
};
}
private void increaseBuffer(StringBuilder buffer, char c) {
buffer.append(c);
}
private int accumulate(int num, char c) {
if (num == 0)
return c-0x30;
return num*10+(c-0x30);
}
private boolean isDigit(char c) {
return c>='0' && c <= '9';
}
测试:
@Test
public void testCollaps() {
String s = "3a11b7cdef2b5e";
String result = new Collaps().collaps(s);
System.out.println(result);
assertEquals(result,"aaabbbbbbbbbbbcccccccdefbbeeeee");
}
闲来无聊敲一敲
public static String strExpand(String str) {
String resStr = "";
String numStr = "";
char[] array = str.toCharArray();
for (int i = 0; i < array.length; i++) {
if (array[i] < 57 && array[i] > 48) {
numStr += array[i];
} else {
if("".equals(numStr)){
numStr = "1";
}
int m = Integer.parseInt(String.valueOf(numStr));
for (int t = 0; t < m; t++) {
resStr += array[i];
}
numStr = "";
}
}
return resStr;
}