59

Javaで文字列の行数を数えるためのコンパクトなコードが必要です。文字列は\rまたはで区切り\nます。これらの改行文字の各インスタンスは、個別の行と見なされます。例えば ​​-

"Hello\nWorld\nThis\nIs\t"

4を返す必要があります。プロトタイプは

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

誰かがステートメントのコンパクトなセットを提供できますか?私はここで解決策を持っていますが、それは長すぎると思います。ありがとうございました。

4

16 に答える 16

86
private static int countLines(String str){
   String[] lines = str.split("\r\n|\r|\n");
   return  lines.length;
}
于 2010-05-17T15:14:38.700 に答える
28

これはどう:

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

このように、文字列を多くの新しい文字列オブジェクトに分割する必要はありません。これらのオブジェクトは、後でガベージコレクタによってクリーンアップされます。(これはを使用するときに発生しString.split(String);ます)。

于 2010-05-17T15:42:24.797 に答える
19

文字列オブジェクト、配列、またはその他の(複雑な)オブジェクトを作成しない非常に単純な解決策は、次を使用することです。

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ターミネータを使用する場合は、この例を少し変更する必要があることに注意してください。

于 2013-09-15T19:07:10.273 に答える
18

Java-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
于 2018-05-31T19:23:04.210 に答える
12

使ってます:

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

LineNumberReaderjava.ioパッケージに含まれています: https ://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html

于 2014-11-06T12:19:54.590 に答える
11

ファイルの行がすでに文字列に含まれている場合は、次のようにすることができます。

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

編集:

ファイルから内容を読み取る必要がある場合に備えて(そうしなかったと言ったのは知っていますが、これは将来の参照用です)、ApacheCommonsを使用してファイルの内容を文字列に読み取ることをお勧めします。これは素晴らしいライブラリであり、他にも多くの便利なメソッドがあります。簡単な例を次に示します。

import org.apache.commons.io.FileUtils;

int getNumLinesInFile(File file) {

    String content = FileUtils.readFileToString(file);
    return content.split(System.getProperty("line.separator")).length;
}
于 2010-05-17T15:15:29.370 に答える
8

Java 8を使用する場合は、次のようにします。

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

(最後の+1は、文字列がトリミングされている場合に最後の行をカウントすることです)

ワンラインソリューション

于 2018-01-12T09:44:02.837 に答える
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;
}
于 2012-02-06T13:46:53.047 に答える
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

ご挨拶:)

于 2017-06-02T16:07:30.160 に答える
1
//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で終わらない場合、これは最後の行をカウントします

于 2018-08-05T14:27:41.850 に答える
0
"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length

あなたもすることができます

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

システムのデフォルトの行区切り文字を使用します。

于 2010-05-17T15:12:34.903 に答える
0

これは、「魔法の」正規表現やその他の複雑なSDK機能を使用しないソリューションです。

明らかに、正規表現マッチャーは、書くのが速いので、実際の生活で使用する方がおそらく良いでしょう。(そして、おそらくバグもありません...)

一方、ここで何が起こっているのかを理解できるはずです...

ケースを\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++;
    }
}
于 2010-05-17T16:00:09.640 に答える
0
new StringTokenizer(str, "\r\n").countTokens();

これは空の行をカウントしないことに注意してください(\ n \ n)。

CRLF(\ r \ n)は、単一の改行としてカウントされます。

于 2010-05-17T18:49:44.307 に答える
0

このメソッドはcharの配列を割り当てます。length()はcharではなくUnicode文字の数を使用するため、string.length()を反復処理する代わりに使用する必要があります。

int countChars(String str, char chr) {
    char[] charArray = str.toCharArray();
    int count = 0;
    for(char cur : charArray)
        if(cur==chr) count++;
    return count;
}
于 2016-12-17T21:19:50.030 に答える
0

はどうですかStringUtils.countMatches()

あなたの場合

StringUtils.countMatches("Hello\nWorld\nThis\nIs\t", "\n") + StringUtils.countMatches("Hello\nWorld\nThis\nIs\t", "\r") + 1

正常に動作するはずです。

于 2022-01-04T08:08:44.810 に答える
-2

このようなものを探すことをお勧めします

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

JavaのStringSplitメソッドについては、こちらの手順をご覧ください

問題がある場合は、コードを投稿してください

于 2010-05-17T15:12:38.930 に答える