从右边开始,在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"));
}
}
答案 0 :(得分:28)
所有答案似乎都需要做很多代码。您可以使用正则表达式来执行此操作。
假设您有一个返回格式化字符串的方法。
一个简单明了的例子:
String myString = "00000000000111111111111100000000001111111000011000000";
String newString = myString.replaceAll("(.{8})(?!$)", "$1-");
return newString;
以上等于以下较短的符号:
return myString.replaceAll("(.{8})(?!$)", "$1-");
另一个类似的简短符号(如果是固定的,硬编码的字符串):
return "00000000000111111111111100000000001111111000011000000".replaceAll("(.{8})(?!$)", "$1-");
每段代码都会重新生成以下字符串:
00000000-00011111-11111111-00000000-00111111-10000110-00000
有关正则表达式的更多信息,请参阅示例http://www.regular-expressions.info/java.html
希望这有助于将来的任何人。
编辑说明: 最后一组没有8个字符。但是,如果愿意的话,它不会添加另一个破折号。
答案 1 :(得分:16)
从原始char[]
:
String
String str = "100001111111111111111";
// add enough space for an additional "-" for every 8 chars:
char[] chars = new char[str.length() + (str.length() / 8)];
// this offset will give us the first "-" position from the LEFT:
int offset = str.length() % 8;
int idx = 0, strIdx = 0;
for (; strIdx < str.length(); idx++, strIdx++)
{
if (((strIdx % 8) == offset) && (strIdx != 0))
chars[idx++] = '-';
chars[idx] = str.charAt(strIdx);
}
String str2 = new String(chars);
System.out.println(str2);
或者您可以使用StringBuilder
,这可能涉及(length / 8)
数组复制操作:
StringBuilder str = new StringBuilder("100001111111111111111");
int idx = str.length() - 8;
while (idx > 0)
{
str.insert(idx, "-");
idx = idx - 8;
}
System.out.println(str.toString());
两种情况下的输出:
10000-11111111-11111111
请注意,这不会在索引0
处插入连字符,如果需要,您需要调整代码。
答案 2 :(得分:1)
上述解决方案很好,但非常复杂而且很长,我写了这个,它适用于您的输入。
public static String insertCharacterForEveryNDistanceFromRight(int distance, String original, char c){
StringBuilder sb = new StringBuilder();
char[] charArrayOfOriginal = original.toCharArray();
for(int ch = charArrayOfOriginal.length ; ch > 0 ; ch--){
if(ch % distance == 0 && ch != charArrayOfOriginal.length)
sb.append(c).append(charArrayOfOriginal[charArrayOfOriginal.length - ch]);
else
sb.append(charArrayOfOriginal[charArrayOfOriginal.length - ch]);
}
return sb.toString();
}
并称之为......
String rightResult = InsertSpaces.insertCharacterForEveryNDistanceFromRight(8, "100001111111111111111", '-');
System.out.println(rightResult);
答案 3 :(得分:0)
您不能在现有Java String中插入-
,因为String是不可变的。但是,您可以创建符合输出格式要求的新String实例。
从输入字符串的结束索引循环到0.对于每次迭代:
如果需要,使用StringBuilder实例的“toString()”方法来获取字符串。
答案 4 :(得分:0)
或许这样的事情?
for(int i = s.length() - 1; i > 0; i -= 8)
{
s = new StringBuffer(s).insert(i, "-").toString();
i--;
}