需要一些紧凑的代码来计算Java中字符串中的行数。该字符串将由\r
或\n
分隔。这些换行符的每个实例都将被视为一个单独的行。例如 -
"Hello\nWorld\nThis\nIs\t"
应该返回4.原型是
private static int countLines(String str) {...}
有人可以提供一套紧凑的陈述吗?我在这里有一个解决方案,但是我觉得它太长了。谢谢。
答案 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)