【问题标题】:Equivalent of rtrim with StringBuilder in javajava中rtrim与StringBuilder的等价物
【发布时间】:2018-06-23 13:43:53
【问题描述】:

我正在尝试从右侧修剪 StringBuilder,如下所示:

private StringBuilder rtrim(StringBuilder str, Character trimStr) {
    if (str.charAt(str.length() - 1) == trimStr) {
        return str.deleteCharAt(str.length() - 1);
    }
    return str;
}

上述函数可以很好地使用字符作为 trimStr,但我想将 trimStr 作为字符串传递。任何相同的库(类似于 StringUtils)?

【问题讨论】:

    标签: java string replace stringbuilder


    【解决方案1】:

    您可以像这样使用replaceAll 或只使用replaceFirst 和正则表达式:

    String str = "  some string  ";
    str = str.replaceAll("\\s*$", "");//output is "  some string"
    

    编辑

    如果您使用的是 StringBuilder,您可以使用:

    private static StringBuilder rtrim(StringBuilder str, String trimStr) {
        return new StringBuilder(
                str.toString().replaceFirst("(" + Pattern.quote(trimStr) + ")+$", "")
        );
    }
    

    一些输入和输出

    "  some string   "    + " "    ==> "  some string"
    "  some stringaaa"    + "a"    ==> "  some string"
    "  some stringabab"   + "ab"   ==> "  some string"
    

    左修剪 (lTrim)

    对于左修剪,您只需将正则表达式更改为 str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")

    private static StringBuilder rtrim(StringBuilder str, String trimStr) {
        return new StringBuilder(
                str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")
        );
    }
    

    另一个没有正则表达式的解决方案

    右修剪(rTrim)

    public StringBuilder rTrim(StringBuilder str, String trimStr) {
        if (str != null && trimStr != null) {
            int trimLen = trimStr.length();
            int strLen = str.length();
            if (strLen != 0 && trimLen != 0) {
                while (strLen != 0 && str.substring(strLen - trimLen, strLen).equals(trimStr)) {
                    str = str.delete(strLen - trimLen, strLen);
                    strLen = str.length();
                }
            }
        }
        return str;
    }
    

    左修剪 (lTrim)

    public StringBuilder lTrim(StringBuilder str, String trimStr) {
        if (str != null && trimStr != null) {
            int len = trimStr.length();
            if (str.length() != 0 && len != 0) {
                while (str.length() != 0 && str.substring(0, len).equals(trimStr)) {
                    str = str.delete(0, len);
                }
            }
        }
        return str;
    }
    

    【讨论】:

    • 我正在使用 StringBuilder!
    • 虽然这个答案有效,但它会创建三个新的字节数组(toString、replaceFirst 和 StringBuilder 的构造函数),其长度与str.length() 的长度大致相同。 Imo 这部分违背了使用 StringBuilder 的目的,这就是我投反对票的原因。
    • 感谢@Riiverside 的解释,但 OP 在他的问题中谈论性能吗?
    • @Riiverside 通常我也不喜欢评判其他人的解决方案,但是您是否使用此rtrim(new StringBuilder(" some stringaaaa"), "a") 检查了您的解决方案,它会返回错误信息吗?
    • 他没有,但是如果有性能更好的解决方案(至少在内存方面,cpu 可能取决于输入)为什么不使用它呢?如果调用只进行了几次,则无关紧要,但如果调用了数千次,则可能。使用 OP 提供的信息无法判断它被调用了多少次,所以我更喜欢一种更有效的解决方案。
    【解决方案2】:

    正如您所提到的,您可以使用 Apache StringUtils 库:

    private static StringBuilder rTrim(StringBuilder sb, String stripChars) {
        return new StringBuilder(StringUtils.stripEnd(sb.toString(), stripChars));
    }
    
    private static StringBuilder lTrim(StringBuilder sb, String stripChars) {
        return new StringBuilder(StringUtils.stripStart(sb.toString(), stripChars));
    }
    

    【讨论】:

      【解决方案3】:

      这样的事情可能会起作用:

      private StringBuilder rtrim(StringBuilder str, String trimStr) {
          if(str.length() == 0 || trimStr.isEmpty()) {
              return str;
          }
          int lastIndexOf = str.lastIndexOf(trimStr);
      
          if(lastIndexOf >= 0 && lastIndexOf + trimStr.length() == str.length()) {
              str.setLength(lastIndexOf);
          }
          return str;
      }
      

      这将从提供​​的str 的末尾删除trimStr。 直接在StringBuilder 上使用lastIndexOf 可以避免将所有内容都转换为字符串。

      如果你想在str 的末尾删除所有出现的trimStr,你可以这样做:

      private StringBuilder rtrim(StringBuilder str, String trimStr) {
          if(str.length() == 0 || trimStr.isEmpty()) {
              return str;
          }
          int lastIndexOf;
          while((lastIndexOf = str.lastIndexOf(trimStr)) >= 0 && lastIndexOf + trimStr.length() == str.length()) {
              str.setLength(lastIndexOf);
          }
          return str;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 2016-07-16
        • 2011-10-06
        • 2010-09-08
        • 2012-05-09
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多