Conte o número de linhas em uma corda java
Pergunta
Precisa de algum código compacto para contar o número de linhas em uma string em Java. A string deve ser separada por \r
ou \n
. Cada instância desses caracteres da Newline será considerada uma linha separada. Por exemplo -
"Hello\nWorld\nThis\nIs\t"
deve retornar 4. O protótipo é
private static int countLines(String str) {...}
Alguém pode fornecer um conjunto compacto de declarações? Eu tenho uma solução aqui, mas é muito tempo, eu acho. Obrigada.
Solução
private static int countLines(String str){
String[] lines = str.split("\r\n|\r|\n");
return lines.length;
}
Outras dicas
Que tal agora:
String yourInput = "...";
Matcher m = Pattern.compile("\r\n|\r|\n").matcher(yourInput);
int lines = 1;
while (m.find())
{
lines ++;
}
Dessa forma, você não precisa dividir a corda em muitos novos objetos de string, que serão limpos pelo coletor de lixo posteriormente. (Isso acontece ao usar String.split(String);
).
Uma solução muito simples, que não cria objetos de string, matrizes ou outros objetos (complexos), é usar o seguinte:
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;
}
Observe que, se você usar outros terminadores de EOL, precisará modificar um pouco este exemplo.
Se você já tiver as linhas do arquivo em uma string, poderá fazer isso:
int len = txt.split(System.getProperty("line.separator")).length;
EDITAR:
Caso você precise ler o conteúdo de um arquivo (eu sei que você disse que não, mas isso é para referência futura), eu recomendo usar o uso Apache Commons Para ler o conteúdo do arquivo em uma string. É uma ótima biblioteca e tem muitos outros métodos úteis. Aqui está um exemplo simples:
import org.apache.commons.io.FileUtils;
int getNumLinesInFile(File file) {
String content = FileUtils.readFileToString(file);
return content.split(System.getProperty("line.separator")).length;
}
Estou usando:
public static int countLines(String input) throws IOException {
LineNumberReader lineNumberReader = new LineNumberReader(new StringReader(input));
lineNumberReader.skip(Long.MAX_VALUE);
return lineNumberReader.getLineNumber();
}
LineNumberReader
está no java.io
pacote: https://docs.oracle.com/javase/7/docs/api/java/io/linenumberreader.html
Se você usar o Java 8, então:
long lines = stringWithNewlines.chars().filter(x -> x == '\n').count() + 1;
(+1 no final é contar a última linha se a string for aparada)
Uma solução de linha
Com JDK/11 você pode fazer o mesmo usando o String.lines()
API da seguinte maneira:
String sample = "Hello\nWorld\nThis\nIs\t";
System.out.println(sample.lines().count()); // returns 4
O documento da API afirma o seguinte como uma parte dele para a descrição:-
Returns: the stream of lines extracted from this string
Esta é uma versão mais rápida:
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;
}
Tente este:
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
}
Número de linhas = CountLineendings (STR) + 1
Saudações :)
//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;
}
Isso contará a última linha se não terminar em cr/lf cr lf
Bem, esta é uma solução usando regexes "mágicos" ou outros recursos complexos do SDK.
Obviamente, o Regex Matcher é provavelmente melhor de usar na vida real, como é mais rápido de escrever. (E provavelmente é livre de insetos também ...)
Por outro lado, você deve entender o que está acontecendo aqui ...
Se você deseja lidar com o caso r n como uma única linha nova (MSDOS-Convenção), precisa adicionar seu próprio código. Dica, você precisa de outra variável que acompanha o personagem anterior correspondente ...
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();
Observe que isso não contará linhas vazias ( n n).
Crlf ( r n) conta como uma quebra de linha única.
"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length
Você também pode fazer
"Hello\nWorld\nthis\nis".split(System.getProperty("line.separator")).length
Para usar os caracteres (s) do separador de linha padrão de sistemas.
Esse método alocará uma matriz de chars, ele deve ser usado em vez de iterar o String.Length () como comprimento () usa o número de caracteres unicode em vez de chars.
int countChars(String str, char chr) {
char[] charArray = str.toCharArray();
int count = 0;
for(char cur : charArray)
if(cur==chr) count++;
return count;
}
Eu sugiro que você procure algo assim
String s;
s.split("\n\r");
Procure as instruções aqui para Método de String Split de Java
Se você tiver algum problema, poste seu código