考虑以下输入:
String[] input = {"a9", "aa9", "a9a9", "99a99a"};
使用StringBuilder直接替换9之前的任何数字与字母表后面的下一个字母时,最有效的方法是什么?
处理完这些输入后,输出应为:
String[] output = {"b9", "ab9", "b9b9", "99b99a"}
我一直在摸不着头脑,StringBuilder.setCharAt是我能想到的最佳方法。
任何意见或建议都将不胜感激。
答案 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)
正如欧内斯特·弗里德曼 - 希尔指出的那样,以此为实验例,而非最高效的