Нужен некоторый компактный код для подсчета количества строк в строке в Java. Строка должна быть разделена \r
или \n
. Каждый экземпляр тех символов новой строки рассмотрят как отдельную строку. Например -
"Hello\nWorld\nThis\nIs\t"
должен возвратиться 4. Прототип
private static int countLines(String str) {...}
Кто-то может обеспечить компактный набор операторов? У меня есть решение в здесь, но это слишком длинно, я думаю.Спасибо.
private static int countLines(String str){
String[] lines = str.split("\r\n|\r|\n");
return lines.length;
}
Я предлагаю вам поискать что-то вроде этого
String s;
s.split("\n\r");
Найдите здесь инструкции для метода разделения строк Java
Если у вас возникли проблемы, отправьте свой код
"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length
Вы также можете использовать
"Hello\nWorld\nthis\nis".split(System.getProperty("line.separator")).length
, чтобы использовать системные символы разделителя строк по умолчанию.
Если строки из файла уже записаны в строку, вы можете сделать следующее:
int len = txt.split(System.getProperty("line.separator")).length;
EDIT:
На случай, если вам когда-нибудь понадобится прочитать содержимое файла (я знаю, вы сказали, что не читали, но это на будущее), я рекомендую использовать Apache Commons для чтения содержимого файла в строку. Это отличная библиотека, в которой есть много других полезных методов. Вот простой пример:
import org.apache.commons.io.FileUtils;
int getNumLinesInFile(File file) {
String content = FileUtils.readFileToString(file);
return content.split(System.getProperty("line.separator")).length;
}
Что ж, это решение, в котором не используются «волшебные» регулярные выражения или другие сложные функции SDK.
Очевидно, что сопоставление регулярных выражений, вероятно, лучше использовать в реальной жизни, так как его быстрее писать. (И это, вероятно, тоже без ошибок ...)
С другой стороны, вы должны понимать, что здесь происходит ...
Если вы хотите обрабатывать случай \ r \ n как единый new-line (msdos-Convention) вам нужно добавить свой собственный код. Подсказка, вам нужна другая переменная, которая отслеживает предыдущий совпавший символ ...
int lines= 1;
for( int pos = 0; pos < yourInput.length(); pos++){
char c = yourInput.charAt(pos);
if( c == "\r" || c== "\n" ) {
lines++;
}
}
Как насчет этого:
String yourInput = "...";
Matcher m = Pattern.compile("\r\n|\r|\n").matcher(yourInput);
int lines = 1;
while (m.find())
{
lines ++;
}
Таким образом, вам не нужно разделять String на множество новых объектов String, которые будут очищены сборщиком мусора позже. (Это происходит при использовании String.split(String);
).
new StringTokenizer(str, "\r\n").countTokens();
Обратите внимание, что при этом не будут учитываться пустые строки (\n\n).
CRLF (\r\n) считается как разрыв строки.