2014-09-23 59 views
1

我正在寻找一种有效的方法来从字符串中删除最后n行。快速表演以及不会产生太多效果的东西可能是物体。因此想要远离split()。特别是因为有时我的琴弦可能会有几百甚至上千行。删除Java中的字符串中的最后n行(句子)

举例来说,我得到一个字符串,例如:

This is a sample code line 1. 
This is a sample code line 2. 

Warm Regards, 
SomeUser. 

最后3行(空行,“亲切问候”和“ SomeUser的”)是什么,我试图让摆脱。请注意,内容(包括最后3行)不固定。

我想在这里先用这个解决方案计算行数:https://stackoverflow.com/a/18816371/1353174然后再次使用另一个类似的循环来达到一个位置,即行-n,然后执行一个子字符串直到该位置。

但是,只是在这里发布此问题,以了解是否有其他任何可能的更有效的方法来实现此目的。外部基于库的解决方案(如Apache Commons StringUtils)也是受欢迎的。

+0

你想远离'split',但你提供的链接,最好的答案使用'split'。也许是因为它已经被优化了?使用'split'确实会成为你的问题的瓶颈? – AntonH 2014-09-23 19:00:30

+0

不,我提供的链接应该带你到用户“Veger”的答案,并且不使用拆分。 – kpatil 2014-09-24 04:28:17

+0

这就是为什么我说**最佳答案**,而不是**您的答案**。 – AntonH 2014-09-24 13:16:28

回答

3

您可以使用String.lastIndexOf找到 '\ n' 符号,然后最后第三次出现做String.substring得到结果。

 public static void main(String[] args) { 
     String s = "This is a sample code line 1.\n" + 
       "This is a sample code line 2.\n" + 
       "\n" + 
       "Warm Regards,\n" + 
       "SomeUser."; 

     int truncateIndex = s.length(); 

     for (int i = 0; i < 3; i++) { 
      System.out.println(truncateIndex); 
      truncateIndex = s.lastIndexOf('\n', truncateIndex - 1); 
     } 

     System.out.println(s.substring(0, truncateIndex)); 
     System.out.println("--"); 
    } 

此代码段有意不关心角的情况下,如当存在小于三行中输入字符串,使代码简单和可读性。

+0

谢谢,伙计。您的解决方案是我正在使用的解决方案。 – kpatil 2014-09-24 04:44:02

+0

@ searchengine27我不太明白你的意思,但是第一部分,当你说'如果你说s.lastIndexOf('\ n',2000);在一个只有3个新行字符的字符串中,它总会给你字符串中第一个新行字符的索引.'不是真的:'“\ n \ n \ n”.lastIndexOf('\ n' ,2000)'返回'2'。编辑的 – Aivean 2015-07-28 21:42:08

+0

。误读文档。 – searchengine27 2015-07-28 22:03:41

1
public static final String SAMPLE_TEXT = "This is a sample code line 1.\nThis is a sample code line 2.\r\n\nWarm Regards,\r\nSomeUser."; 

public static void main (String[] args) throws java.lang.Exception { 
    String[] lines = SAMPLE_TEXT.split("\\r?\\n"); // catches Windows newlines (\r) as well) 
    for (int i = 0; i < lines.length - 3; i++) { // lines.length - 3 to discard the last 3 lines 
     System.out.println(lines[i]); 
    } 
} 

这里有一个可运行的例子:

http://ideone.com/nwaMcD

+1

他明确表示他想避免使用String.split()。这就是说,我无法想象他实际上有什么样的限制,会阻止他使用它...... – user3062946 2014-09-23 19:15:19

+0

没有硬性限制。我只是有点偏执有split()创建许多字符串对象。我的文本每个实体都会有几千行。在最坏的情况下,我必须处理500到800个这样的实体,并且该过程本身必须确保它在10分钟内完成。必须睡10分钟,并重新开始,并继续做这个24x7。而这一切都将发生在非常苛刻的服务器上。 – kpatil 2014-09-24 04:31:34

相关问题