计算Javastring中的行数

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

 "Hello\nWorld\nThis\nIs\t" 

应该返回4.原型是

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

有人可以提供一套紧凑的报表吗? 我在这里有解决办法,但我觉得这太长了。 谢谢。

  • 我应该避免转换为string,如果一个值已经是一个string?
  • 如何根据子串匹配来selectR data.table行(一个像SQL一样)
  • Java:将string转换为ByteBuffer以及相关的问题
  • C - “char var ”和“char * var”之间的区别?
  • 压缩/解压缩string与C#
  • 生成固定长度的填充空格的string
  • 在PowerShell中连接一个variables和一个没有空格的string文字
  • C#:如何获得一个string的第一个字符?
  • 12 Solutions collect form web for “计算Javastring中的行数”

     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方法的说明

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