-1

我是Java的初学者。下面是我写的一段代码。目的是在每个大写字符之间添加一个空格,例如 string="ILoveMyDog" 到 "I Love My Dog"。然而,这段代码的结果是“ILoveMy Dog”。有人可以帮我找出问题所在吗?upperCaseList 是另一种提取所有大写字符的索引并将它们放入列表中的方法,我很确定那部分是正确的

for (int i = 0; i < upperCaseList.size(); i++) {
    newStr = w.replace(w.substring(upperCaseList.get(i), upperCaseList.get(i)+1), " "+ w.substring(upperCaseList.get(i), upperCaseList.get(i)+1));
    }
return newStr
4

2 回答 2

0

这是因为您通过在循环内String.replace重新分配来覆盖结果。newStr所以,你只能看到最后一次替换的效果。

假设内容upperCaseList1, 5, 7

在 Loop 迭代 1 之后,newStrI LoveMyDog

在 Loop 迭代 2 之后,newStrILove MyDog(您没有使用之前的结果,而是使用原始字符串)

在循环迭代 3 之后,newStrILoveMy Dog

尝试这个,

String newStr = w;
for (int i = 0; i < upperCaseList.size(); i++) {
    newStr = newStr.replace(w.substring(upperCaseList.get(i), upperCaseList.get(i)+1), " "+ w.substring(upperCaseList.get(i), upperCaseList.get(i)+1));
}

不过有很多方法可以解决这个问题。而不是存储包含大写字符的索引列表并使用String.substringand String.replace,您可以StringBuilder通过循环遍历字符并检查它是否为大写/小写来从原始字符串构建字符串。

StringBuilder resultBuilder = new StringBuilder();

for (int i = 1; i < w.length(); i++) { //Note: Starting at index 1
    if (Character.isUpperCase(w.charAt(i))) {
        resultBuilder.append(" ")
                .append(w.charAt(i));
    } else {
        resultBuilder.append(w.charAt(i));
    }
}
System.out.println(resultBuilder.toString());
于 2018-09-02T03:28:52.930 回答
0

不确定您是如何创建 upperCaseList 的,我建议为所有人设置一个循环。希望下面的代码能满足您的要求。

public void test(){

    String str ="ILoveMyDog";
    StringBuilder strBuilder  = new StringBuilder();

    for (int i = 0; i< str.length() ; i++) {
        if(Character.isUpperCase(str.charAt(i))){
            //add space
            strBuilder.append(" ");
        }
        //add the orginal char
        strBuilder.append(str.charAt(i));
    }
    //use toString method 
    System.out.println(strBuilder.toString());
}
于 2018-09-02T04:11:57.807 回答