Java悬赏问题,Java语言如何展开字符串:

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;
    }