替换字符串的第n个字符但忽略空格的最佳方法?

时间:2018-10-06 04:40:11

标签: java string

我正在尝试找出替换字符串的第n个字符的最佳方法,但是在循环时忽略空格。例如,如果我要将字符串mary had a little lamb的每第5个字符更改为z,则应返回mary zad azlittze lazb

我认为的一种方法是删除所有空格(maryhadalittlelamb),然后将所有第5个字符更改为zmaryzadazlittzelazb),然后引用原始字符串,找到索引" "并将其插入maryzadazlittzelazb

但是,这似乎不是很优雅,我敢肯定还有更好的方法,有人可以建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我将使用String.toCharArray(),然后使用常规的for循环进行迭代,并使用Character.isWhitespace(char)测试每个字符是否不是空格。如果不是,请增加第二个计数器(在这里称为p),并检查该值是否可被5整除。如果是这样,请将其设置为z。最后,根据编辑后的String创建一个新的char[]。喜欢,

String str = "mary had a little lamb";
char[] arr = str.toCharArray();
for (int i = 0, p = 0; i < arr.length; i++) {
    if (!Character.isWhitespace(arr[i]) && ++p % 5 == 0) {
        arr[i] = 'z';
    }
}
System.out.println(new String(arr));

我得到了(正如我在评论中提到的)

mary zad a lzttle zamb

此外,由于可能不太清楚,因此上面的复杂if等同于

if (!Character.isWhitespace(arr[i])) {
    p++;
    if (p % 5 == 0) {
        arr[i] = 'z';
    }
}

答案 1 :(得分:1)

为完整起见,我的建议应如下所示:

public static void main(String... args) {
  Pattern p = Pattern.compile("((\\S\\s*){4})\\S");
  Matcher m = p.matcher("mary had a little lamb");
  StringBuffer sb = new StringBuffer();
  while (m.find()) {
    m.appendReplacement(sb, "$1z");
  }
  m.appendTail(sb);
  System.out.println(sb.toString()); 
}