Вопрос: Подсчитайте количество строк в строке Java


Нужен какой-то компактный код для подсчета количества строк в строке в Java. Строка должна быть разделена \r или \n, Каждый экземпляр этих символов новой строки будет рассматриваться как отдельная строка. Например -

"Hello\nWorld\nThis\nIs\t"

должен вернуться 4. Прототип

private static int countLines(String str) {...}

Может ли кто-нибудь предоставить компактный набор инструкций? Думаю, у меня есть решение, но слишком долго. Спасибо.


35


источник


Ответы:


private static int countLines(String str){
   String[] lines = str.split("\r\n|\r|\n");
   return  lines.length;
}

61



Как насчет этого:

String yourInput = "...";
Matcher m = Pattern.compile("\r\n|\r|\n").matcher(yourInput);
int lines = 1;
while (m.find())
{
    lines ++;
}

Таким образом, вам не нужно разделить String на множество новых объектов String, которые позже будут очищены сборщиком мусора. (Это происходит при использовании String.split(String);).


23



Очень простое решение, которое не создает объекты String, массивы или другие (сложные) объекты, заключается в следующем:

public static int countLines(String str) {
    if(str == null || str.isEmpty())
    {
        return 0;
    }
    int lines = 1;
    int pos = 0;
    while ((pos = str.indexOf("\n", pos) + 1) != 0) {
        lines++;
    }
    return lines;
}

Обратите внимание, что если вы используете другие терминаторы EOL, вам нужно немного изменить этот пример.


15



Если у вас есть строки из файла уже в строке, вы можете сделать это:

int len = txt.split(System.getProperty("line.separator")).length;

РЕДАКТИРОВАТЬ:

На всякий случай вам когда-нибудь понадобится прочитать содержимое из файла (я знаю, что вы сказали, что нет, но это для будущей справки), я рекомендую использовать 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;
}

9



Я использую:

public static int countLines(String input) throws IOException {
    LineNumberReader lineNumberReader = new LineNumberReader(new StringReader(input));
    lineNumberReader.skip(Long.MAX_VALUE);
    return lineNumberReader.getLineNumber();
}

LineNumberReader находится в java.io пакет: https://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html


5



Это более быстрая версия:

public static int countLines(String str)
{
    if (str == null || str.length() == 0)
        return 0;
    int lines = 1;
    int len = str.length();
    for( int pos = 0; pos < len; pos++) {
        char c = str.charAt(pos);
        if( c == '\r' ) {
            lines++;
            if ( pos+1 < len && str.charAt(pos+1) == '\n' )
                pos++;
        } else if( c == '\n' ) {
            lines++;
        }
    }
    return lines;
}

3



Если вы используете Java 8, то:

long lines = stringWithNewlines.chars().filter(x -> x == '\n').count() + 1;

(+1 в конце - подсчитать последнюю строку, если строка обрезана)

Однострочное решение


3