【问题标题】:Java Stringbuilder.replaceJava Stringbuilder.replace
【发布时间】:2012-02-28 07:12:35
【问题描述】:

考虑以下输入:

String[] input = {"a9", "aa9", "a9a9", "99a99a"};

在使用 StringBuilder 将字母表中紧接在 9 之前的任何数字替换为它之后的下一个字母时,最有效的方法是什么?

处理这些输入后,输出应为:

String[] output = {"b9", "ab9", "b9b9", "99b99a"}

我一直在摸不着头脑,StringBuilder.setCharAt 是我能想到的最佳方法。

任何意见或建议将不胜感激。

【问题讨论】:

  • 如果按预期工作,这种方法有什么问题?
  • 我不认为你可以用正则表达式来做到这一点......
  • @LouisWasserman:是的,你可以,请看下面我的回答。
  • 啊,我明白了。当然,如果您使用Matcher 逐步构建结果,则可以使用正则表达式来完成;我以为你的意思是打一个 replaceAll 电话。
  • 确实如此。不知道你为什么要使用正则表达式来做这么简单的事情,尤其是当这样做的代码比不需要的代码长时。

标签: java string stringbuilder


【解决方案1】:

您想使用一个非常简单的状态机。对于您在输入字符串中循环的每个字符,跟踪一个布尔值。如果字符是 9,则将布尔值设置为 true。如果字符是字母,则在字母上加一并将布尔值设置为 false。然后将字符添加到输出字符串生成器。

对于输入,您使用Reader。对于输出,请使用 StringBuilder

【讨论】:

    【解决方案2】:

    由于您必须查看每个字符,因此您在缓冲区大小方面的表现永远不会比线性更好。所以你可以做类似的事情

    for (int i=1; buffer.length() ++i) // Note this starts at "1"
        if (buffer.charAt[i] == '9')
            buffer.setCharAt(i-1, buffer.getCharAt(i-1) + 1);
    

    【讨论】:

      【解决方案3】:

      使用 1 标记前瞻解析器技术。这是一些伪代码:

      for (int index = 0; index < buffer.length(); ++index)
      {
        if (index < buffer.length() - 1)
        {
          if (buffer.charAt(index + 1) == '9')
          {
            char current = buffer.charAt(index) + 1; // this is probably not the best technique for this.
            buffer.setCharAt(index, current);
          }
        }
      }
      

      【讨论】:

        【解决方案4】:

        另一种解决方案是例如使用

        StringUtils.indexOf(String str, char searchChar, int startPos) 
        

        正如 Ernest Friedman-Hill 指出的那样,将此作为实验示例,而不是最高效的

        【讨论】:

          【解决方案5】:

          您可以按照以下代码:

          String[] input = {"a9", "aa9", "a9a9", "99a99a", "z9", "aZ9"};
          String[] output = new String[input.length];
          Pattern pt = Pattern.compile("([a-z])(?=9)", Pattern.CASE_INSENSITIVE);
          for (int i=0; i<input.length; i++) {
              Matcher mt = pt.matcher(input[i]);
              StringBuffer sb = new StringBuffer();
              while (mt.find()) {
                  char ch = mt.group(1).charAt(0);
                  if (ch == 'z') ch = 'a';
                  else if (ch == 'Z') ch = 'A';
                  else ch++;
                  mt.appendReplacement(sb, String.valueOf(ch));
              }
              mt.appendTail(sb);
              output[i] = sb.toString();
          }
          System.out.println(Arrays.toString(output));
          

          输出:

          [b9, ab9, b9b9, 99b99a, a9, aA9]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-25
            • 2013-10-03
            • 2013-05-08
            • 2010-12-09
            • 2010-09-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多