Java将字符串与单个字符串分开

时间:2016-02-19 18:42:01

标签: java regex

我有一个字符串集,它是" 5X3I3M3X"

我想分开5X = 1X1X1X1X1X,取决于角色前面的数字" X"

所以最后它可能是1X1X1X1X1X3I3M1X1X1X

我是这样做的,

    String str = "5X3I3M3X";
    StringBuffer sBuffer = new StringBuffer("");

    for(int i = 1 ; i < str.length() ; i=i+2) {
        if( str.charAt(i) == 'X'){

            if(str.charAt(i-1) == 1){
                sBuffer.append(str.charAt(i-1)+""+str.charAt(i));
            }else{
                StringBuffer sBufferTemp = new StringBuffer("");

                for(int j=0 ; j < Character.getNumericValue(str.charAt(i-1)) ; j++){
                    sBufferTemp.append("1X");
                }

                sBuffer.append(sBufferTemp.toString());
            }
        } else {
            sBuffer.append(str.charAt(i-1)+""+str.charAt(i));
        }
    }
    System.out.println(sBuffer.toString());

我想知道是否有任何简单的方法来分离逻辑? 注意。如果我想添加到单独的&#39; I&#39;,那么它应该动态更改,例如&#34; 1X1X1X1X1X1I1I1I3M1X1X1X&#34;

如果(str.charAt(I)==&#39; I&#39;)....我可以更改我的代码。

我希望有另一种简单的方法来实现它。

3 个答案:

答案 0 :(得分:1)

您可以将可配置的字符数组传递给方法。使用此配置,您可以检查当前字符是否可扩展。

以下程序的输出:

1X1X1X1X1X1I1I1I1M1M1M1X1X1X
public class StringExpander {
    public static void main(String[] args) {
        System.out.println(expand("5X3I3M3X", new char[] { 'X', 'I', 'M' }));
    }

    public static String expand(String str, char[] chArr) {
        StringBuffer buff = new StringBuffer();
        for (int i = 1; i < str.length(); i = i + 2) {
            char ch = str.charAt(i);
            if (contains(chArr, ch)) {
                if (str.charAt(i - 1) == 1) {
                    buff.append(str.charAt(i - 1)).append(str.charAt(i));
                } else {
                    StringBuffer tempBuff = new StringBuffer();
                    int repeat = Character.getNumericValue(str.charAt(i - 1));
                    for (int j = 0; j < repeat; j++) {
                        tempBuff.append(1).append(ch);
                    }
                    buff.append(tempBuff);
                }
            } else {
                buff.append(str.charAt(i - 1)).append(ch);
            }
        }
        return buff.toString();
    }

    private static boolean contains(char[] arr, char val) {
        for (char ch : arr) {
            if (ch == val) {
                return true;
            }
        }
        return false;
    }
}

答案 1 :(得分:1)

根据您的编码解决方案,我建议进行以下更改:

String str = "5X3I3M3X";
StringBuilder sBuffer = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
    if (i + 1 < str.length()
            && str.charAt(i + 1) == 'X'
            && str.charAt(i) != '1'
            && Character.isDigit(str.charAt(i))) {
        int n = Character.getNumericValue(str.charAt(i));
        for (int j = 0 ; j < n; ++j) {
            sBufferTemp.append("1X");
        }
        ++i;
    } else {
        sBuffer.append(str.charAt(i));
    }
}
  • 使用更新更快的StringBuilder而不是StringBuffer
  • 遍历所有i,因此默认情况下的追加是直截了当的
  • 条件可以更完整,检查&#39; 1&#39;不需要。
  • char&#39; 1&#39;必须与之比较,而不是1。

答案 2 :(得分:0)

我知道这不完全是语法糖......

String str = "5X3I3M3X";
char[] filter = new char[]{'X', 'I', 'M'};
StringBuffer stringBuffer = new StringBuffer("");

for (int i = 0; i < str.length(); i++) {
    if (i != 0 && new String(filter).contains(Character.toString(str.charAt(i))) && Character.isDigit(str.charAt(i-1))) {
        for (int j = 0; j < Character.getNumericValue(str.charAt(i-1)); j++) {
            stringBuffer.append("1" + str.charAt(i));
        }
    } else if (i < str.length()-1 && new String(filter).contains(Character.toString(str.charAt(i+1)))) {
        //do nothing
    }
    else {
        stringBuffer.append(str.charAt(i));
    }
}