9

从右边开始,在 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"));
  }
}
4

5 回答 5

34

对于需要做的事情,所有答案似乎都有很多代码。您可以使用正则表达式来做到这一点。

假设您有一个返回格式化字符串的方法。

一个简单明了的例子:

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 个字符。但是,如果它会,它不会添加另一个破折号。

于 2013-09-26T12:11:59.463 回答
17

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);

或者您可以使用 a 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

请注意,这不会在 index 处插入连字符,0如果有必要,您需要调整代码。

于 2012-08-15T17:44:25.843 回答
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);
于 2014-05-27T13:25:51.427 回答
0

您不能从字面上将 a-插入现有的 Java String,因为 String 是不可变的。但是,您可以创建一个新的 String 实例来满足您的输出格式要求。

从输入字符串的结束索引循环到 0。对于每次迭代:

  • 将当前索引处的值插入到StringBuilder实例的开头。
  • 使用模运算符查看是否插入了 8 个字符的倍数。如果是这样,请插入破折号。

如果需要,请使用 StringBuilder 实例的“toString()”方法获取字符串。

于 2012-08-15T17:42:27.297 回答
0

大概是这样的?

for(int i = s.length() - 1; i > 0; i -= 8)
{
    s = new StringBuffer(s).insert(i, "-").toString();
    i--;
}
于 2012-08-15T17:43:48.773 回答