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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top