Java中去除字符串末尾制表符的最简单方法

5
如果您有一组以制表符分隔的值列表:
foo1\tfoo2\tfoo3\tfoo4\t

由于每次使用+=时自动附加\t,因此添加了最后一个\t
如何轻松地删除最后一个\t?以便结果为:
foo1\tfoo2\tfoo3\tfoo4

根据Hover的请求,这是一个我所拥有的小例子:

String foo = "";
for (int i = 1; i <= 100; i++) {
    foo += "foo" + "\t";
    if (i % 10 == 0) {
        foo = foo.trim(); // wasn't working
        foo += "\n";
    }
}
System.out.println(foo);

输出(用字符串化的制表符替换实际制表符以便在此处显示):

foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t
foo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\tfoo\t

这就是我问这个问题的主要原因,.trim() 没有起作用,因此我认为 trim() 不是用于删除尾随制表符的。


4
请不要在循环中使用 += 来构建字符串,否则会导致二次运行时间。 - Matt Ball
8
只需在字符串上调用 trim() 即可。 - Hovercraft Full Of Eels
1
"\t"不是可以使用trim()函数去除的空格。 - asifsid88
@link_boy:那你的尝试方法可能不正确。如果正确使用,它应该可以正常工作。如果对你来说无法正常工作,请在编辑中展示你的代码,这样我们就可以告诉你如何修复它。 - Hovercraft Full Of Eels
@HovercraftFullOfEels 做了一个我所说的例子。 - link_boy
显示剩余13条评论
6个回答

9
String s1 = "foo1\tfoo2\tfoo3\tfoo4\t".trim();

"trim()" 只移除空格吗? - Henry
@Henry trim() -> "返回一个字符串,其值为此字符串,去除任何前导和尾随空格。" - myselfmiqdad

5
String expectedString = "foo1\tfoo2\tfoo3\tfoo4\t".trim();

4
如果你只是想去除末尾的制表符,你可以这么做:
String s1 = "foo1\tfoo2\tfoo3\tfoo4\t";
while (s1.endsWith("\t")) {
    s1 = s1.substring(0, s1.length()-1);
}

+1 不错的想法 :) - 不过使用 StringBuilder 可能会更好,因为这样可以避免创建大量小的 String - MadProgrammer
太好了!我一直在寻找这个。谢谢!使用其他方法会出现异常,但这个可以解决它。 - link_boy

1
如果您的循环看起来像这样:
for(...){
     values += foo + number + "\t" 
}

你可以:
  • 使用 trim()
  • 使用 values.substring(0,values.length-1)
  • 修改循环,执行 n-1 次迭代,并手动应用最后一部分而不带制表符
  • 为第 n 次迭代添加显式测试,不应用 "\t" (values += foo + (i==n-1)? numbers:numbers+"\t")

1

HovercraftFullOfEels是正确的,String#trim应该可以满足您的需求...

String testing = "foo1\tfoo2\tfoo3\tfoo4\t";
System.out.println("\"" + testing.trim() + "\"");
if (testing.endsWith("\t")) {
    testing = testing.substring(0, testing.lastIndexOf("\t"));
    System.out.println("\"" + testing + "\"");
}

输出什么?

"foo1   foo2    foo3    foo4"
"foo1   foo2    foo3    foo4"

更新
如果那失败了……就像这样……
StringBuilder sb = new StringBuilder(testing);
while (sb.lastIndexOf("\t") == sb.length()) {
    sb.delete(sb.length() - 1, sb.length());
}
System.out.println("\"" + sb.toString() + "\"");

可能会有帮助...

1
为了澄清我们的讨论,如果您运行此代码,会看到什么?
public class Foo3 {
   public static void main(String[] args) {
      String foo = "";
      for (int i = 1; i <= 100; i++) {
         if (i % 10 == 1) {
            foo += "\"";
         }

         foo += "foo" + "\t";
         if (i % 10 == 0) {
            foo = foo.trim(); // wasn't working
            foo += "\"\n";
         }
      }
      System.out.println(foo);
   }
}

我自己得到的结果是:

"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"
"foo    foo foo foo foo foo foo foo foo foo"

展示了一个良好运行的trim()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接