计算Java String中的行数

时间:2010-05-17 15:08:47

标签: java string lines

需要一些紧凑的代码来计算Java中字符串中的行数。该字符串将由\r\n分隔。这些换行符的每个实例都将被视为一个单独的行。例如 -

"Hello\nWorld\nThis\nIs\t"

应该返回4.原型是

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

有人可以提供一套紧凑的陈述吗?我在这里有一个解决方案,但是我觉得它太长了。谢谢。

15 个答案:

答案 0 :(得分:73)

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

答案 1 :(得分:25)

这个怎么样:

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

这样您就不需要将String拆分为许多新的String对象,稍后将由垃圾收集器清理。 (使用String.split(String);时会发生这种情况。)

答案 2 :(得分:15)

一个非常简单的解决方案,它不会创建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终止符,则需要稍微修改此示例。

答案 3 :(得分:10)

如果文件中的行已经存在于字符串中,则可以执行以下操作:

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

答案 4 :(得分:7)

我正在使用:

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 :(得分:4)

如果您使用Java 8,那么:

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

(如果裁剪字符串,最后+ 1将计算最后一行)

一线解决方案

答案 6 :(得分:3)

这是一个更快的版本:

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

答案 7 :(得分:3)

使用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 :(得分:1)

试试这个:

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

问候:)

答案 9 :(得分:0)

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

您也可以

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

使用系统默认行分隔符。

答案 10 :(得分:0)

嗯,这是一个不使用“魔法”正则表达式或其他复杂的sdk功能的解决方案。

显然,正则表达式匹配器在现实生活中可能更好用,因为它写得更快。 (它也可能没有bug ......)

另一方面,你应该能够理解这里发生的事情......

如果要将case \ r \ n作为单个换行符(msdos-convention)处理,则必须添加自己的代码。提示,你需要另一个跟踪前一个匹配的字符的变量......

int lines= 1;

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

答案 11 :(得分:0)

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

请注意,这不会计算空行(\ n \ n)。

CRLF(\ r \ n)计为单行中断。

答案 12 :(得分:0)

此方法将分配一个字符数组,应该使用它而不是遍历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;
}

答案 13 :(得分:0)

//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结尾,它将计算最后一行

答案 14 :(得分:-2)

我建议你找这样的东西

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

查看Java's String Split method

的说明

如果您有任何问题,请发布您的代码