2014-09-23 46 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

相關問題