提问人:Hello 提问时间:10/19/2023 最后编辑:Hello 更新时间:10/19/2023 访问量:109
返回一个新字符串,其中包含原始字符串的所有字符,每个字符之间带有下划线
Return a new string containing all characters of original string with underscores between each character
问:
我正在尝试创建一个方法,其中 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_
代码正确返回,每个字符之间都有下划线,但我不确定如何确保下划线不会出现在字符串的末尾。
任何帮助都是值得赞赏的!
答:
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
评论
spaceString
_