【发布时间】:2012-08-12 00:58:08
【问题描述】:
在 Java 字符串中每 8 个字符后插入一个-(破折号/减号字符)的最佳方法是什么,从右侧开始?
例子:
1111 -> 1111
111111111 -> 1-11111111
1111111111111111 -> 11111111-11111111
100001111111111111111 -> 10000-11111111-11111111
我的尝试,表明我已经尝试过自己做(下面的评论问:“这是作业吗?”:
import junit.framework.TestCase;
public class InsertCharacterAfterEveryNCharacters extends TestCase {
public static String insertSpacerAfterNCharactersFromTheRight(char spacer,
int spacing, String string) {
final int length = string.length();
final int newStringCapacity = length + (int) Math.ceil(length / (double) spacing);
StringBuilder stringBuilder = new StringBuilder(newStringCapacity);
for (int i = length - 1; i >= 0; i--) {
stringBuilder.append(string.charAt(i));
if (i % spacing == 0 && i > 0) {
stringBuilder.append(spacer);
}
}
return stringBuilder.toString();
}
public static void testInsertSpacerAfterNCharactersFromTheRight() {
assertEquals("", insertSpacerAfterNCharactersFromTheRight('-', 8, ""));
assertEquals("1", insertSpacerAfterNCharactersFromTheRight('-', 8, "1"));
assertEquals("11", insertSpacerAfterNCharactersFromTheRight('-', 8, "11"));
assertEquals("11111111",
insertSpacerAfterNCharactersFromTheRight('-', 8, "11111111"));
assertEquals("1-11111111",
insertSpacerAfterNCharactersFromTheRight('-', 8, "111111111"));
assertEquals("11111111-11111111",
insertSpacerAfterNCharactersFromTheRight('-', 8, "1111111111111111"));
}
}
【问题讨论】:
-
没什么花哨的,但是一个好的旧 for 循环可以解决问题。使用 new StringBuffer(key).insert(position, "-").toString();
-
对于该循环,对 (string.length%8) 个字符进行第一次迭代,然后跳过 8 个字符。在循环中使用 StringBuilder,这样您就不必一直创建新的 String 对象,只需在每次迭代中附加 String 的前缀即可。
-
你说得对,让我添加我自己的解决方案来(正确地)表明我在发布之前已经完成了一些自己的工作。
-
关于获得 5 票推荐“insert()”的评论,这不是在每次调用时执行不必要的 ArrayCopy 吗?