计算Javastring中的行数

需要一些紧凑的代码来计算Java中string的行数。 该string将由\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分解成很多新的String对象,这些对象稍后会被垃圾收集器清理。 (这发生在使用String.split(String); )时。

不创buildString对象,数组或其他(复杂)对象的非常简单的解决scheme是使用以下内容:

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

如果你已经有一个string中的文件的行,你可以这样做:

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

编辑:

万一你需要从文件中读取内容(我知道你说过没有,但这是为了将来的参考),我推荐使用Apache Commons将文件内容读入一个string。 这是一个伟大的图书馆,还有许多其他有用的方法。 这是一个简单的例子:

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

我在用:

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

那么,这是一个不使用“魔术”正则expression式或其他复杂的sdkfunction的解决scheme。

显然,正则expression式匹配器在现实生活中使用可能更好,因为它的编写速度更快。 (也可能是无错的…)

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

如果你想把这种情况作为一个新行(msdos-convention)来处理,你必须添加你自己的代码。 提示,你需要另一个variables,跟踪以前的字符匹配…

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

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

CRLF(\ r \ n)算作单行换行。

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

你也可以做

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

使用系统默认行分隔符(s)。

这个方法将分配一个字符数组,它应该被用来代替迭代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; } 

试试这个:

 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

问候 :)

我build议你看看这样的东西

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

在这里查看Java的String Split方法的说明

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