0

我正在尝试创建一个返回原始字符串版本的方法,如下所示:原始字符串中出现的每个数字 0-9 都替换为该数字右侧出现的多次字符。所以字符串“a3tx2z”产生“attttxzzz”,“12x”产生“2xxx”。后面没有字符的数字(即在字符串的末尾)被空替换。

我已经编写了代码,但它只适用于第一个数字,下一个数字保持不变。

public String blowUp( String str ){

        StringBuffer buffer = null;
        String toAdd = null;
        String toReturnString = null;

        if( str.length() == 0 ){

            return "no string found";
        }else{

            for( int count = 0; count < str.length(); count++ ){

                char c = str.charAt( count );

                if( count == str.length() - 1 ){

                    if( Character.isDigit( c ) ){

                        return str.substring( 0, count );
                    }else{

                        return str;
                    }
                }else if( Character.isDigit( c ) ){

                    char next = str.charAt( count + 1 );
                    buffer = new StringBuffer();
                    int nooftimes = Integer.parseInt(Character.toString( c ));

                    for( int j = 0; j < nooftimes; j++ ){

                        buffer.append( next );
                    }
                    toAdd = buffer.toString();
                    toReturnString = str.substring( 0, count ) + toAdd + str.substring( count + 1 );
                    return toReturnString;
                }
            }
        return toReturnString;
        }
    //  return toReturnString;
    }
4

4 回答 4

1

见评论。

public String blowUp(String str) {

        StringBuffer buffer = new StringBuffer();
        // String toAdd = null;
        // String toReturnString = null;

        if (str.length() == 0) {
            return "no string found";
        } else {

            for (int count = 0; count < str.length(); count++) {

                char c = str.charAt(count);
                /*
                 * if (count == str.length() - 1) {
                 * 
                 * if (Character.isDigit(c)) {
                 * 
                 * return str.substring(0, count); } else {
                 * 
                 * return str; } } else
                 */
                if (Character.isDigit(c) && count < str.length()-1) {

                    char next = str.charAt(count + 1);

                    if (!Character.isDigit(next)) { // append only if next
                                                    // character isn't digit

                        // buffer = new StringBuffer();
                        int nooftimes = Integer.parseInt(Character.toString(c));

                        for (int j = 0; j < nooftimes; j++) {

                            buffer.append(next);
                        }

                    } else {
                        buffer.append(str.charAt(count+1)); // append digit followed by another digit with next digit
                    }
                    // toAdd = buffer.toString();
                    // toReturnString = str.substring(0, count) + toAdd
                    // + str.substring(count + 1);
                } else {
                    buffer.append(c); // simply append if not digit
                }
            }
            return buffer.toString();
        }
        // return toReturnString;
    }
于 2013-10-03T03:40:49.347 回答
0

您的代码中不少于 5return点,这真的非常非常糟糕。这使得无法准确地确定代码中发生了什么。

我是老派,所以我相信任何方法都有一个入口点和一个出口点,这使得弄清楚发生了什么变得容易得多......

让我们从...

    if( str.length() == 0 ){
        return "no string found";

这实际上应该返回原件String不变......你不觉得......

            if( count == str.length() - 1 ){
                if( Character.isDigit( c ) ){
                    return str.substring( 0, count );
                }else{
                    return str;
                }

我什至无法弄清楚你为什么需要这个。最后一个字符并不比第一个更特别,除了如果它是一个数字,你应该忽略它......

                char next = str.charAt( count + 1 );
                buffer = new StringBuffer();
                int nooftimes = Integer.parseInt(Character.toString( c ));
                for( int j = 0; j < nooftimes; j++ ){
                    buffer.append( next );
                }
                toAdd = buffer.toString();
                toReturnString = str.substring( 0, count ) + toAdd + str.substring( count + 1 );
                return toReturnString;

那你return来了!但是您只输入了这部分代码一次!剩下的String呢?

你似乎也忽略String了我所知道的所有其他角色......

一个更简单的想法是使用StringBuffer(或StringBuilder我更喜欢)并继续将结果值附加到它,例如......

public static String blowUp(String str) {
    StringBuilder sb = new StringBuilder(128);
    for (int count = 0; count < str.length(); count++) {
        char c = str.charAt(count);
        if (Character.isDigit(c) && count < str.length() - 1) {
            char next = str.charAt(count + 1);
            int nooftimes = Integer.parseInt(Character.toString(c));
            for (int j = 0; j < nooftimes; j++) {
                sb.append(next);
            }
            count++;
        } else if (!Character.isDigit(c)) {
            sb.append(c);
        }
    }
    return sb.toString();
}

示例输入输出

如果我输入...

a3tx2z    
12x    
a3tx2z1    
12x1    

我明白了

atttxzz
2x
atttxzz
2x

作为输出

于 2013-10-03T03:44:59.037 回答
0

看起来你让这变得比它必须的更复杂,并且在这个过程中让逻辑有点混乱。

在伪代码中,这个问题基本上归结为以下几点:

for every character 'c' in the input, starting from the first:
    if c is not a digit:
        add c to the output
    otherwise (i.e. if c is a digit), if c is not the last character in the input:
        let 'x' be the number represented by c
        let 'n' be the next character in the input after c
        add x copies of n to the output
return the output

我将把它翻译成 Java 留给你*


* 编辑:@TheKojuEffect

于 2013-10-03T03:41:05.113 回答
0

@MadProgrammer 我根据您的代码进行了一些修改。

public String blowup(String str) {
    StringBuilder sb = new StringBuilder();
    for(int i =0; i < str.length(); i++) {
        char c = str.charAt(i);
        if(Character.isDigit(c) && i < str.length()-1) {
            char next = str.charAt(i+1);
            if(!Character.isDigit(next)) {
                int repTimes = Integer.parseInt(Character.toString(c));
                for(int k = 0; k < repTimes; k++) {
                    sb.append(next);
                }
            }
            else {
                sb.append(c);
            }
        }
        else {
            sb.append(c);
        }
    }
    return new String(sb);
}
于 2014-02-10T17:03:29.707 回答