Java Stringbuilder.replace

时间:2012-02-06 19:59:53

标签: java string stringbuilder

考虑以下输入:

String[] input = {"a9", "aa9", "a9a9", "99a99a"};

使用StringBuilder直接替换9之前的任何数字与字母表后面的下一个字母时,最有效的方法是什么?

处理完这些输入后,输出应为:

String[] output = {"b9", "ab9", "b9b9", "99b99a"}

我一直在摸不着头脑,StringBuilder.setCharAt是我能想到的最佳方法。

任何意见或建议都将不胜感激。

5 个答案:

答案 0 :(得分:2)

由于您必须查看每个字符,因此在缓冲区大小方面的性能绝不会超过线性。所以你可以做一些像

这样的事情
for (int i=1; buffer.length() ++i) // Note this starts at "1"
    if (buffer.charAt[i] == '9')
        buffer.setCharAt(i-1, buffer.getCharAt(i-1) + 1);

答案 1 :(得分:1)

您可以关注代码:

String[] input = {"a9", "aa9", "a9a9", "99a99a", "z9", "aZ9"};
String[] output = new String[input.length];
Pattern pt = Pattern.compile("([a-z])(?=9)", Pattern.CASE_INSENSITIVE);
for (int i=0; i<input.length; i++) {
    Matcher mt = pt.matcher(input[i]);
    StringBuffer sb = new StringBuffer();
    while (mt.find()) {
        char ch = mt.group(1).charAt(0);
        if (ch == 'z') ch = 'a';
        else if (ch == 'Z') ch = 'A';
        else ch++;
        mt.appendReplacement(sb, String.valueOf(ch));
    }
    mt.appendTail(sb);
    output[i] = sb.toString();
}
System.out.println(Arrays.toString(output));

<强>输出:

[b9, ab9, b9b9, 99b99a, a9, aA9]

答案 2 :(得分:0)

您想要使用非常简单的状态机。对于您在输入字符串中循环的每个字符,请跟踪布尔值。如果字符是9,则将布尔值设置为true。如果字符是字母,则在字母中添加一个字母并将布尔值设置为false。然后将该字符添加到输出stringbuilder。

对于输入,您使用Reader。输出使用StringBuilder

答案 3 :(得分:0)

使用1个令牌前瞻解析器技术。这是一些伪造的代码:

for (int index = 0; index < buffer.length(); ++index)
{
  if (index < buffer.length() - 1)
  {
    if (buffer.charAt(index + 1) == '9')
    {
      char current = buffer.charAt(index) + 1; // this is probably not the best technique for this.
      buffer.setCharAt(index, current);
    }
  }
}

答案 4 :(得分:0)

另一种解决方案是使用

StringUtils.indexOf(String str, char searchChar, int startPos) 
正如欧内斯特·弗里德曼 - 希尔指出的那样,以此为实验例,而非最高效的