计算Java字符串中的行数

计算Java字符串中的行数,java,string,lines,Java,String,Lines,需要一些紧凑的代码来计算Java中字符串中的行数。字符串将由\r或\n分隔。这些换行符的每个实例都将被视为一个单独的行。比如说- "Hello\nWorld\nThis\nIs\t" 应该返回4。原型是 private static int countLines(String str) {...} 有人能提供一组紧凑的语句吗?我这里有一个解决方案,但我认为它太长了。多谢各位 "Hello\nWorld\nthis\nIs\t".split("[\n\r]").length 你也可以这样做

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

"Hello\nWorld\nThis\nIs\t"
应该返回4。原型是

private static int countLines(String str) {...}
有人能提供一组紧凑的语句吗?我这里有一个解决方案,但我认为它太长了。多谢各位

"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length
你也可以这样做

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

使用系统默认的行分隔符字符。

String s; 
s.split("\n\r");
请在此处查找有关的说明


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

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

private static int countLines(String str){
   String[] lines = str.split("\r\n|\r|\n");
   return  lines.length;
}
int len = txt.split(System.getProperty("line.separator")).length;
编辑:

为了防止您需要从文件中读取内容(我知道您说过不需要,但这是供将来参考),我建议使用将文件内容读入字符串。这是一个很棒的库,还有许多其他有用的方法。下面是一个简单的例子:

import org.apache.commons.io.FileUtils;

int getNumLinesInFile(File file) {

    String content = FileUtils.readFileToString(file);
    return content.split(System.getProperty("line.separator")).length;
}
这个怎么样:

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

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

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

显然,在现实生活中使用正则表达式匹配器可能更好,因为它编写速度更快。(而且它可能也没有bug…)

另一方面,你应该能够理解这里发生了什么

如果要将案例作为一行新行处理(msdos约定),则必须添加自己的代码。提示,您需要另一个变量来跟踪先前匹配的字符

int lines= 1;

for( int pos = 0; pos < yourInput.length(); pos++){
    char c = yourInput.charAt(pos);
    if( c == "\r" || c== "\n" ) {
        lines++;
    }
}
int行=1;
对于(int pos=0;pos
请注意,这不会计算空行(\n\n)


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

这是一个更快的版本:

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;
}
publicstaticintcountlines(stringstr)
{
如果(str==null | | str.length()==0)
返回0;
int行=1;
int len=str.length();
对于(int pos=0;pos
一个非常简单的解决方案,不创建字符串对象、数组或其他(复杂)对象,它使用以下方法:

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终止符,则需要稍微修改此示例。

我使用的是:

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
包中:

此方法将分配一个字符数组,应该使用它而不是在字符串上迭代。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;
}
试试这个:

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


问候语:)

如果您使用Java 8,那么:

long lines = stringWithNewlines.chars().filter(x -> x == '\n').count() + 1;
(如果字符串被修剪,最后的+1将计数最后一行)


使用Java-11及以上版本的单线解决方案,您可以使用API执行相同的操作,如下所示:

String sample = "Hello\nWorld\nThis\nIs\t";
System.out.println(sample.lines().count()); // returns 4
API文件说明了以下内容,作为说明的一部分:-

//导入java.util.regex.Matcher;
//导入java.util.regex.Pattern;
私有静态模式newlinePattern=Pattern.compile(“\r\n |\r |\n”);
公共静态整数行数(字符串输入){
Matcher m=newlinePattern.Matcher(输入);
整数计数=0;
int matcherEnd=-1;
while(m.find()){
matcherEnd=m.end();
计数++;
}
if(matcherEnd

如果最后一行没有以cr/lf结尾,则此操作将计算最后一行。cr/lf

此操作不起作用,因为它仅在
\n\r
序列上拆分。是的,它不起作用。那里应该是一个加油站。我建议将其作为一个建议,而不是一个真正的实现:)如果它能够正确地处理文件,那么它将是
System.getProperty(“line.separator”)。但我认为情况并非如此,您以前(编辑前)的解决方案是正确的。行不是来自文件,它只是一个字符串。但是这是一个很好的代码,虽然FileUtils.readFileToString(file)参数不应该是java.io.file实例,但上面的代码传递的是字符串(我使用的是Commons io 2.4)?@BigRich-是的,你是对的。谢谢你指出这一点,我更正了代码。如果你在Windows上创建了一个文件,而你的JVM在linux操作系统上,那么这段代码就不起作用,反之亦然。如果您可以假设文件的格式与运行jvm的操作系统的格式相同,那没关系。@autra-这更像是一个一般类型的问题。在尝试解析文件之前,应该先修复行结尾,使其适用于给定的操作系统。或者,如果您知道文件是Windows格式(例如,您知道行尾类型),您也可以为此编写代码。虽然我并不认为这是否决我的答案的理由,但你有权发表你的意见。虽然这对几乎所有的用例都非常好,但我只想指出,这会创建很多从未使用过的字符串,但仍然需要内存和gc。这可能只是一个频繁使用的服务器、电话或其他东西上的问题,但它仍然是一个难题。这不是有效的答案。如果您的字符串只包含新行,则不起作用。@kukis如果您想包含尾随的新行,您必须为split的limit参数传递一个显式参数-1(即str.split(“\r\n | \r | \n”,-1);如果您查看此处的文档,它有更多信息。一行
int count=text.split(“\r\n |\r |\n”).length;
自java 1.1以来,就有一个LineNumberReader。请参见下面我的答案。如果
String sample = "Hello\nWorld\nThis\nIs\t";
System.out.println(sample.lines().count()); // returns 4
Returns:
the stream of lines extracted from this string
//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;
}