Java字符串,从右开始,每8个字符后插入一个破折号

Java字符串,从右开始,每8个字符后插入一个破折号,java,string,Java,String,从右边开始,在Java字符串中每8个字符后插入一个-(破折号/减号字符)的最佳方法是什么 示例: 1111 -> 1111 111111111 -> 1-11111111 1111111111111111 -> 11111111-11111111 100001111111111111111 -> 10000-11111111-11111111 我的尝试,是为了表明我已经试着自己做了(下面有一条评论问:“这是家庭作业吗?”: 您不能直接将-插入现有Java字符串中,因为字

从右边开始,在Java字符串中每8个字符后插入一个
-
(破折号/减号字符)的最佳方法是什么

示例:

1111 -> 1111
111111111 -> 1-11111111
1111111111111111 -> 11111111-11111111
100001111111111111111 -> 10000-11111111-11111111
我的尝试,是为了表明我已经试着自己做了(下面有一条评论问:“这是家庭作业吗?”:


您不能直接将
-
插入现有Java字符串中,因为字符串是不可变的。但是,您可以创建满足输出格式要求的新字符串实例

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

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

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

可能是这样的吗

for(int i = s.length() - 1; i > 0; i -= 8)
{
    s = new StringBuffer(s).insert(i, "-").toString();
    i--;
}

从原始的
字符串构建
字符[]

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);
两种情况下的输出:

10000-11111111-11111111


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

对于需要执行的操作,所有答案似乎都有很多代码。您可以使用正则表达式来执行此操作

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

一个简单明了的例子:

String myString = "00000000000111111111111100000000001111111000011000000";
String newString = myString.replaceAll("(.{8})(?!$)", "$1-");
return newString;
上述符号等于以下较短符号:

return myString.replaceAll("(.{8})(?!$)", "$1-");
另一种类似的简短表示法(对于固定的硬编码字符串):

每段代码都会重新返回以下字符串:

00000000-00011111-11111111-00000000-00111111-10000110-00000
有关正则表达式的更多信息,请参见示例

希望这对将来的任何人都有帮助

编辑注:
最后一组没有8个字符。但是,如果有,它不会再添加一个破折号。

上述解决方案很好,但非常复杂和长,我写了这个,它适用于您的输入

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

没有什么奇怪的,但是一个好的旧for循环可以实现这一点。使用新的StringBuffer(key).insert(position,“-”).toString();对于该循环,对(string.length%8)执行第一次迭代字符,然后跳过8个字符。在循环中使用StringBuilder,这样您就不必一直创建新的字符串对象,只需在每次迭代中添加字符串的前缀。您是对的,让我将自己的解决方案添加到(正确的)表明我在发布之前做了一些自己的工作。关于获得5票赞成票的评论,建议“插入(),这不是在每次调用时都执行不必要的ArrayCopy吗?我刚刚想到,如果他事先指定StringBuilder的长度,这会执行得更好吗?我不确定StringBuilder在内部如何处理字符串。是的,可能,但我想你可以测量一下差异:-)它取决于最终字符串相对于StringBuilder分配的初始缓冲区的长度,以及进行总长度计算的成本。总长度计算是一个简单的算术运算:string.length+string.length/8+1@G.Bach:是的,但是内存移动操作也不是很昂贵(适用于小型内存块).我们正在研究一种针对小型输入字符串的微优化。寻找。你会学到一些好东西。嗯,你能提供更多的信息吗?如果你说他的代码更好,但更多的信息就更好了。是因为我创建了多个StringBuffer吗?只是好奇——为什么你不+1 pb2q的答案如果你是在用它来评论另一个答案吗?@thattidotguy-true,我应该在我的评论中添加一些信息:第一:
StringBuffer
支持同步,而
StringBuilder
不支持同步,因此这可能会根据字符串长度稍微提高性能。第二:不需要创建StringBuff架线工(或架线工)在每一次迭代中,您可以在开始时创建它,并在每个for循环迭代中插入值。@ AmiTrEN,当我评论这篇文章时,PB2Q的答案只有StrugBuudor解决方案,我认为它不是最合适的,而是第一眼的。现在我在午饭后回来,并且有了解决方案:<代码> char []。
,这更有趣、更有效(我倾向于这样编码),现在他让我投了赞成票。这个答案得到了3票赞成票,但我想知道:是否真的有必要执行完整的
系统。数组复制(值、偏移量、值、偏移量+len、计数-偏移量)
每8个字符一次,而不是创建正确大小的缓冲区并以增量方式填充它?@Robottinosino很好的一点,这个解决方案很简单。添加了数组操作解决方案。很棒的解决方案!:DInsert
-
来自“右侧”?您可以使用a反转字符串,将正则表达式应用于反转的字符串,然后再次反转以获得所需的结果。代价很高..但谢谢。
00000000-00011111-11111111-00000000-00111111-10000110-00000
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);