【问题标题】:Java: simpler way of cutting off end of stringJava:切断字符串结尾的更简单方法
【发布时间】:2014-11-30 15:52:49
【问题描述】:

每当我遇到这种情况时,我都会问自己同样的问题:难道没有一种更简单、更不烦人的方法来将字符串从结尾处截取 X 个字符吗?

假设我得到了 "Helly there bla bla" 并且 - 为什么 - 我需要截掉最后 2 个字符,从而得到 "Helly there bla b"。 我现在将执行以下操作:

String result = text.substring(0, text.length() - 2);

我宁愿做这样的事情:

String result = text.cutOffEnd(2);

我知道那里有很多 String 库,但不知道其中很多,而且我从未见过类似的东西,所以我希望你们中的某个人可能知道得更好:)

编辑:

问:为什么不直接构建自己的 util 方法/类?

答:我不想使用自己的 util 方法。我不会为“null 或 empty”或其他琐碎的事情编写 util 方法。我认为必须有一些可用的东西,因为我会说很多人在他们的一生中经常需要这种功能。 另外:我在许多不同的项目中工作,只想依赖一个简单的库调用,如“Strings.nullToEmpty(str)”等。我只是不自己构建类似的东西,尽管它很微不足道。

问:为什么text.substring(0, text.length() - 2);不够好?

答:如果您将它与我想要的功能进行比较,它会非常笨重。另外,请考虑一下:如果您确定字符串,它会变得更加笨拙:

String result = otherClass.getComplicatedCalculatedText(par1, par2).substring(0,
otherClass.getComplicatedCalculatedText(par1, par2).length() - 2);

显然我需要使用一个局部变量,在这一点上这是不必要的......因为它可能只是:

String result = otherClass.getComplicatedCalculatedText(par1, par2).cutOffEnd(2);

【问题讨论】:

  • text.substring(text.length() - 2) 会返回最后 2 个字符并且不切断最后 2 个字符!
  • 只需创建自己的字符串实用程序类
  • 感谢 icza,一秒钟前也意识到了这一点。使代码更加庞大。我编辑了问题。

标签: java substring


【解决方案1】:

通过以下代码

public class OddNumberLoop {

  public static void main(String[] args) {

    String st1 = "Helly there bla bla";
    String st2 = st1.substring(0, st1.length() - 2);
    System.out.println(st2);

  }

}

祝你好运!!!

【讨论】:

  • 我不明白你在做什么。请解释一下。这就是我得到的,又大又烦人。
  • 你想得到没有最后两个字符的 st1 字符串,所以当我们在 Java 中使用 substring() 时,我们必须给出子字符串的起点和终点。在我的代码中,我将字符串的第一个字符作为起点,然后将“st1.length() - 2”作为终点。为了得到终点,我得到了字符串的长度并减去 2 。这意味着将新字符串与现有字符串分开,没有原始(st1)字符串的最后2个字符
  • 这听起来可能很刻薄,但您是否完整阅读了我的问题?我知道如何使用子字符串来做到这一点,但是,正如上面在入口问题中所述,这种方式既笨重又烦人(imo),创建一个漂亮的 util 方法会很容易——但是为什么没有任何库有一个?这是我的问题。
【解决方案2】:

starnard 库中没有内置的实用程序,但是自己为此编写一个 util 方法有多难?

public static String cutOffEnd(String s, int n) {
    return s == null || s.length() <= n ? "" : s.substring(0, s.length() - n);
}

包含检查的完整解决方案:

public static String cutOffEnd(String s, int n) {
    if (s == null)
        throw new NullPointerException("s cannot be null!");
    if (n > s.length())
        throw new IllegalArgumentException("n cannot be greater"
                      + " than the length of string!");

    return s.substring(0, s.length() - n);
}

【讨论】:

  • 我建议不要使用这样的实用方法。它在原始调用中隐藏了一个 npe,用一个空字符串进行交易;它还添加到堆栈中;并降低可读性 - 对于保存单个方法参数这样一个简单的快捷方式
  • 我不想为自己写这样的东西,我在许多不同的项目中工作,如果有像 Strings 或 StringUtils 之类的实用程序库,那将是浪费精力。不幸的是,到目前为止我找不到那样的东西:/
  • @guido 这只是为了演示。一个完整的解决方案还应该检查n 是否不大于String 的长度。
  • @icza 是的,我明白这回答了这个问题,我的评论可能必须在 OP 下进行,而不是在这里。
【解决方案3】:
  • 顺便说一句:此类功能请求通常是向 java 编译器发出的。通常这些功能对语言来说并不引人注目,并且不会被修复
  • 你为什么喜欢剪掉它?如果它用于更高级别的解决方案,那么您喜欢匹配模式或结构。在这种情况下,您无论如何都应使用自己的 Util-Method 进行解析。

一个现实的例子:

String url = "http://www.foo.bar/#abc";
String site = url.substring(0, url.indexOf("#"));
// this shall be extracted into a utils-method 
// anyway like `MyURLParser.cutOfAnchor()`.

这里禁止要求具体的图书馆。

【讨论】:

    【解决方案4】:

    通过使用一些字符串库。我建议使用 Apache 的 commons lang。

    对于你的情况,这就足够了。

    import org.apache.commons.lang.StringUtils;
    String result = StringUtils.removeEnd( "Helly there bla bla", "la");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多