2014-09-23 3 views
1

Я ищу эффективный способ удаления последних n строк из строки. Эффективные, как быстродействующие, так и то, что не создает, тоже могут быть объектами. Поэтому хотелось бы держаться подальше от split(). Тем более, что иногда мои строки могут составлять несколько сотен или даже тысячи строк.Удалить последние n строк (предложений) в String в Java

Например, я получаю строку, как например:

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

+0

Нет, ссылка, которую я предоставил, должна отвезти вас к ответу пользователем «Veger», и это не использует split. – kpatil

+0

Вот почему я сказал ** верхний ответ **, а не ** ваш ответ **. – AntonH

ответ

3

Вы можете использовать String.lastIndexOf найти последнее третье вхождение '\ п' символ, а затем сделайте 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

+0

@ searchengine27 Я не совсем понимаю, что вы имеете в виду, но первая часть, когда вы указываете «Если вы скажете s.lastIndexOf ('\ n', 2000); в строке, которая содержит только 3 новых строковых символа, она всегда будет давать вам индекс первого нового символа строки в строке. 'просто неверно:' '\ n \ n \ n" .lastIndexOf ('\ n' , 2000) 'возвращает' 2'. – Aivean

+0

redacted. неправильно прочитать документацию. – searchengine27

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

+0

Никаких жестких ограничений как таковых. Я просто немного параноик о том, что split() создает много объектов String. Мой текст был бы где угодно рядом с несколькими тысячами строк на сущность. В худшем случае от 500 до 800 таких объектов, которые я должен обработать, и сам процесс должен обеспечить, чтобы он заканчивался в течение 10 минут. Должен спать 10 минут и начинать все заново, и продолжайте делать это 24x7. И все это будет происходить на очень требовательном сервере. – kpatil

Смежные вопросы