Подтвердить что ты не робот

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

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

"Hello\nWorld\nThis\nIs\t"

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Очень простое решение, которое не создает объекты 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, вам нужно немного изменить этот пример.

Ответ 4

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

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;
}

Ответ 5

Я использую:

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

Ответ 6

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

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

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

Решение одной линии

Ответ 7

С JDK/11 вы можете сделать то же самое, используя String.lines() API, следующим образом:

String sample = "Hello\nWorld\nThis\nIs\t";
System.out.println(sample.lines().count()); // returns 4

Документ API содержит часть описания для описания: -

Returns:
the stream of lines extracted from this string

Ответ 8

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

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;
}

Ответ 9

Попробуйте следующее:

public int countLineEndings(String str){

    str = str.replace("\r\n", "\n"); // convert windows line endings to linux format 
    str = str.replace("\r", "\n"); // convert (remaining) mac line endings to linux format

    return str.length() - str.replace("\n", "").length(); // count total line endings
}

количество строк = countLineEndings (str) + 1

Приветствия:)

Ответ 10

//import java.util.regex.Matcher;
//import java.util.regex.Pattern;

private static Pattern newlinePattern = Pattern.compile("\r\n|\r|\n");

public static int lineCount(String input) {
    Matcher m = newlinePattern.matcher(input);
    int count = 0;
    int matcherEnd = -1;
    while (m.find()) {
        matcherEnd = m.end();
        count++;
    }
    if (matcherEnd < input.length()) {
        count++;
    }

    return count;
}

Это будет считать последнюю строку, если она не заканчивается в cr/lf cr lf

Ответ 11

"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length

Вы также можете сделать

"Hello\nWorld\nthis\nis".split(System.getProperty("line.separator")).length

чтобы использовать символ разделителя строк по умолчанию.

Ответ 12

Ну, это решение, не использующее никаких "магических" регулярных выражений или других сложных функций sdk.

Очевидно, что помощник регулярных выражений, вероятно, лучше использовать в реальной жизни, так как его быстрее писать. (И это, вероятно, ошибка тоже...)

С другой стороны, вы должны понимать, что происходит здесь...

Если вы хотите обрабатывать случай \r\n как одну новую строку (соглашение msdos), вы должны добавить свой собственный код. Подсказка: вам нужна другая переменная, которая отслеживает предыдущий символ, сопоставленный...

int lines= 1;

for( int pos = 0; pos < yourInput.length(); pos++){
    char c = yourInput.charAt(pos);
    if( c == "\r" || c== "\n" ) {
        lines++;
    }
}

Ответ 13

new StringTokenizer(str, "\r\n").countTokens();

Обратите внимание, что это не будет считать пустые строки (\n\n).

CRLF (\ r\n) подсчитывается как разрыв одной строки.

Ответ 14

Этот метод будет выделять массив символов, он должен использоваться вместо итерации по string.length(), поскольку length() использует количество символов Unicode, а не символов.

int countChars(String str, char chr) {
    char[] charArray = str.toCharArray();
    int count = 0;
    for(char cur : charArray)
        if(cur==chr) count++;
    return count;
}

Ответ 15

Я предлагаю вам найти что-то вроде этого

String s; 
s.split("\n\r");

Ищите инструкции для Метод разделения строк Java

Если у вас возникли проблемы, отправьте свой код