Javaで文字列の行数をカウントするためのコンパクトなコードが必要です。文字列は、\r
または\n
で区切られます。これらの改行文字の各インスタンスは、個別の行と見なされます。例えば -
"Hello\nWorld\nThis\nIs\t"
4を返す必要があります。プロトタイプは
private static int countLines(String str) {...}
誰かが簡潔な一連のステートメントを提供できますか?私はここで解決策を持っていますが、長すぎると思います。ありがとうございました。
private static int countLines(String str){
String[] lines = str.split("\r\n|\r|\n");
return lines.length;
}
これはどう:
_String yourInput = "...";
Matcher m = Pattern.compile("\r\n|\r|\n").matcher(yourInput);
int lines = 1;
while (m.find())
{
lines ++;
}
_
この方法では、文字列を多数の新しい文字列オブジェクトに分割する必要はありません。これらのオブジェクトは、後でガベージコレクタによってクリーンアップされます。 (String.split(String);
を使用している場合に発生します)。
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ターミネータを使用する場合、この例を少し変更する必要があることに注意してください。
ファイルの行がすでに文字列に含まれている場合、これを行うことができます。
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;
}
使っています:
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
Java 8を使用する場合:
long lines = stringWithNewlines.chars().filter(x -> x == '\n').count() + 1;
(最後の+1は、文字列がトリムされた場合に最後の行をカウントすることです)
ワンラインソリューション
これはより速いバージョンです:
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;
}
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
これを試してください:
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
ご挨拶:)
まあ、これは「魔法の」正規表現やその他の複雑な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++;
}
}
//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で終わらない場合、これは最後の行をカウントします
"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length
あなたもできる
"Hello\nWorld\nthis\nis".split(System.getProperty("line.separator")).length
システムのデフォルトの行区切り文字を使用します。
このメソッドは文字の配列を割り当てます。length()は文字ではなく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;
}
new StringTokenizer(str, "\r\n").countTokens();
空行(\ n\n)はカウントされないことに注意してください。
CRLF(\ r\n)は、単一の改行としてカウントされます。