返回一个新字符串,其中包含原始字符串的所有字符,每个字符之间带有下划线

Return a new string containing all characters of original string with underscores between each character

提问人:Hello 提问时间:10/19/2023 最后编辑:Hello 更新时间:10/19/2023 访问量:109

问:

我正在尝试创建一个方法,其中 currentString 返回,每个字符中间都有下划线。例如,如果当前字符串为:“hi there”,则输出字符串的开头或结尾没有下划线。我知道这可以通过正则表达式和 replaceAll 来完成,但我正在尝试用 for 循环来完成这一点h_i__t_h_e_r_e

我当前的代码如下所示:

 public String spacedWord()
    {
            String spacedString = "";
            for (int i = 0; i<currentString.length(); i++)
            {
                spacedString = spacedString+currentString.charAt(i)+"_";
            
            }
            return spacedString;
            
    }

如果当前字符串是“嘿,那里”,我的代码将返回末尾并带有下划线。h_e_y_ _t_h_e_r_e_

代码正确返回,每个字符之间都有下划线,但我不确定如何确保下划线不会出现在字符串的末尾。

任何帮助都是值得赞赏的!

java 字符串 for 循环 方法 charat

评论

0赞 Hello 10/19/2023
出于某种原因,它不会让我输入下划线,但为了清楚起见,我的代码在“嘿,那里”中的 e 之后输出一个下划线
0赞 Andrew S 10/19/2023
提示:尝试使用子字符串,与 length 结合使用,以少一个字符返回。spaceString
0赞 Jim Garrison 10/19/2023
这两个例子是不一致的。在第一个中,空白被删除,但在第二个中保留。实际要求是什么?
0赞 Old Dog Programmer 10/19/2023
它出现在您的示例中,除了末尾不需要的空格外,还要删除空白区域,但存在于您的实际输出示例中。空白,实际上是要删除的吗?编辑提示:将示例输入、预期输出和实际输出放在反引号 (') 字符之间会有所帮助,就像使用一小段代码一样。_
0赞 Hello 10/19/2023
空白是留下来,我的错

答:

0赞 Ariclene Chimbili 10/19/2023 #1

“-1”技巧。

String spacedString = "";
String currentString= "Hello Peaple";
for (int i = 0; i<currentString.length()-1; i++)
{
    spacedString = spacedString+currentString.charAt(i)+"_";
}
spacedString = spacedString+currentString.charAt(currentString.length()-1);
return spacedString;

评论

1赞 Hello 10/19/2023
这行得通!谢谢!
0赞 Ariclene Chimbili 10/19/2023
别客气。
0赞 Reilas 10/19/2023 #2

"...我不确定如何确保下划线不会出现在字符串的末尾。..."

跳过第一个索引,并在下划线前面加上下划线。

String spacedString = "";
for (int i = 0; i<currentString.length(); i++)
{
    if (i != 0) spacedString += "_";
    spacedString += currentString.charAt(i);

}
return spacedString;

或者,使用 StringBuilder 插入字符。向后迭代,以避免长度增加。

StringBuilder s = new StringBuilder(currentString);
for (int i = s.length() - 1; i > 0; i--) s.insert(i, '_');

或者,利用 for 循环String#toCharArray 方法。

String spacedString = "";
int i = 0;
for (char c : currentString.toCharArray())
{
    if (i++ != 0) spacedString += '_';
    spacedString += c;

}
return spacedString;

或者,使用String#join 方法。

String spacedString
    = String.join("_", currentString.chars()
                                    .mapToObj(x -> String.valueOf((char) x))
                                    .toList());

输出

h_i_ _t_h_e_r_e
0赞 Bohemian 10/19/2023 #3

您可以将正则表达式用于单行:

public static String spacedWord() {
    return currentString.replaceAll("(?<=\\S) *(?=\\S)", "_");
}

其工作原理是将字符串中非空格字符 = 之间的所有位置替换为下划线,可以选择包括任何空格。

此表达式是任何非空格字符的后向(断言),而此表达式是任何非空格字符的前瞻(断言)。(?<=\\S)(?=\\S)

0赞 Jeroen Gremmen 10/19/2023 #4

首先,不要在循环中使用字符串加法;它污染了堆。请改用:StringBuilder

public String spacedWord()
{
  StringBuilder spacedString = new StringBuilder();
  for(int i = 0, l = currentString.length(); i < l; i++) {
    if (i > 0)
      spacedString.append('_');
    spacedString.append(currentString.charAt(i));      
  }

  return spacedString.toString();
}
0赞 garykwwong 10/19/2023 #5

我想你也可以尝试使用这个代码片段。这里的概念是延迟下划线的附加,直到遇到非空格字符。

public static String spacedWord(String currentString) {

    final StringBuilder sb = new StringBuilder(currentString.length());
    int underscoreLength = 0;
    boolean hasFirstNonspaceChar = false;

    for (int i = 0; i < currentString.length(); i++) {

        char c = currentString.charAt(i);
        // ignore leading space
        if (c == ' ' && !hasFirstNonspaceChar) {
            underscoreLength = 0;
            continue;
        }

        if ( c == ' ') {
            // delay the appending of underscore with a counter
            underscoreLength++;
        } else {
            if (!hasFirstNonspaceChar) {
                hasFirstNonspaceChar = true;
            } else {
                // increment the count of underscore needs to be prepended before next character
                underscoreLength++;
            }
            prependUnderscore(sb, underscoreLength);
            underscoreLength = 0; // reset the counter
            sb.append(c);
        }

    }
    return sb.toString();
}

private static void prependUnderscore(StringBuilder sb, int length) {
    for (int i = 0 ; i < length ; i++) {
        sb.append('_');
    }
}

测试:

public static void main(String[] 参数) { 字符串输入;

    SpaceWord sw = new SpaceWord();

    input = "hi there";
    System.out.println(sw.spacedWord(input));

    input = " hi there";
    System.out.println(sw.spacedWord(input));

    input = "  hi there";
    System.out.println(sw.spacedWord(input));

    input = "hi there ";
    System.out.println(sw.spacedWord(input));

    input = "hi there  ";
    System.out.println(sw.spacedWord(input));
}

输出:

h_i__t_h_e_r_e
h_i__t_h_e_r_e
h_i__t_h_e_r_e
h_i__t_h_e_r_e
h_i__t_h_e_r_e