【问题标题】:Best way to replace nth character of a string but ignores white space?替换字符串的第 n 个字符但忽略空格的最佳方法?
【发布时间】:2018-10-06 04:40:10
【问题描述】:

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

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

但这似乎不是很优雅,我相信有更好的方法可以做到这一点,有人可以建议吗?

谢谢!

【问题讨论】:

  • 在字符串中循环,每第 n 个字符用替换字符替换它,前提是它是字符串
  • 我得到“mary zad a lzttle zamb”。你如何从a little 得到azlittze
  • 对不起,我可能只是把自己弄糊涂了,但这有帮助吗?玛丽扎德 a lzttle zamb => 1234 512 3 451234 5123
  • 我会使用正则表达式替换所有:像 ((\S\s*){4})\S 这样的正则表达式将匹配(并记住)4 个字符,其中空格交错,后跟一个字符,然后您可以将其替换为 @987654332 @ - 这将把它记住的 4 个字符和交错的空格放在 z...
  • Nawnit的方法不够好吗?似乎循环遍历字符串并计算字符是最简单且非常有效的,仅通过字符串进行 1 次循环。

标签: java string


【解决方案1】:

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

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

我明白了(正如我在 cmets 中提到的)

mary zad a lzttle zamb

另外,因为可能不是很清楚,上面复杂的if等价于

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

【讨论】:

  • 如果我们必须是极简主义者 - 你可以早一点退出循环(如果剩余数小于 5);)
【解决方案2】:

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

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

【讨论】:

  • 您的解决方案返回“mary zad a lzttle zamb”,但应该返回“mary zad azlittze lazb”(如问题)。还测试“m a r y had a liitle lamb”。
  • @MikhailIonkin 如果我每 5 个字符替换一次,忽略空格,我看不出我应该如何用 az 替换“a”和“little”之间的空格 ...
  • 好的,我看到 cmets 有问题。您的解决方案通过了我的测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2019-05-26
相关资源
最近更新 更多