web-dev-qa-db-fra.com

Compter le nombre de lignes dans une chaîne Java

Besoin d'un code compact pour compter le nombre de lignes dans une chaîne en Java. La chaîne doit être séparée par \r ou \n. Chaque occurrence de ces caractères de nouvelle ligne sera considérée comme une ligne distincte. Par exemple -

"Hello\nWorld\nThis\nIs\t"

devrait retourner 4. Le prototype est 

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

Quelqu'un peut-il fournir un ensemble compact d'énoncés? J'ai une solution ici mais c'est trop long, je pense. Je vous remercie.

42
Simon Guo
private static int countLines(String str){
   String[] lines = str.split("\r\n|\r|\n");
   return  lines.length;
}
72
Rango

Que dis-tu de ça:

String yourInput = "...";
Matcher m = Pattern.compile("\r\n|\r|\n").matcher(yourInput);
int lines = 1;
while (m.find())
{
    lines ++;
}

De cette façon, vous n'avez pas besoin de diviser la chaîne en un grand nombre de nouveaux objets chaîne, qui seront nettoyés par le ramasse-miettes ultérieurement. (Cela se produit lors de l’utilisation de String.split(String);).

24

Une solution très simple, qui ne crée pas d'objets String, de tableaux ou d'autres objets (complexes), consiste à utiliser les éléments suivants:

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

Notez que si vous utilisez d’autres terminateurs EOL, vous devez modifier légèrement cet exemple.

15
Veger

Si vous avez déjà les lignes du fichier dans une chaîne, vous pouvez faire ceci:

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

MODIFIER:

Juste au cas où vous auriez besoin de lire le contenu d'un fichier (je sais que vous avez dit le contraire, mais ceci est pour référence future), je vous recommande d'utiliser Apache Commons pour lire le contenu du fichier dans une chaîne. C'est une excellente bibliothèque et de nombreuses autres méthodes utiles. Voici un exemple simple:

import org.Apache.commons.io.FileUtils;

int getNumLinesInFile(File file) {

    String content = FileUtils.readFileToString(file);
    return content.split(System.getProperty("line.separator")).length;
}
10
dcp

J'utilise:

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 dans le package Java.io: https://docs.Oracle.com/javase/7/docs/api/Java/io/LineNumberReader.html

7
dermoritz

Si vous utilisez Java 8, alors:

long lines = stringWithNewlines.chars().filter(x -> x == '\n').count() + 1;

(+1 à la fin compte la dernière ligne si la chaîne est coupée)

Solution en une ligne

4
Gleb S

Ceci est une version plus rapide:

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

Avec JDK/11, vous pouvez utiliser l’API String.lines() comme suit:

String sample = "Hello\nWorld\nThis\nIs\t";
System.out.println(sample.lines().count()); // returns 4

La doc de l'API indique ce qui suit dans la description: - 

Returns:
the stream of lines extracted from this string
2
nullpointer

Essaye celui-là:

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
}

nombre de lignes = countLineEndings (str) + 1

Salutations :) 

1
Zephram

Eh bien, c’est une solution qui n’utilise pas de regex "magiques", ni d’autres fonctionnalités complexes de sdk.

De toute évidence, le matcher regex est probablement préférable d'utiliser dans la vie réelle, car il est plus rapide à écrire. (Et c'est probablement sans bug aussi ...)

D'autre part, vous devriez être capable de comprendre ce qui se passe ici ...

Si vous voulez traiter le cas\r\n comme une nouvelle ligne (convention msdos), vous devez ajouter votre propre code. Astuce, vous avez besoin d'une autre variable qui garde la trace du caractère précédent correspondant ...

int lines= 1;

for( int pos = 0; pos < yourInput.length(); pos++){
    char c = yourInput.charAt(pos);
    if( c == "\r" || c== "\n" ) {
        lines++;
    }
}
0
KarlP
//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;
}

Ceci comptera la dernière ligne si elle ne se termine pas par cr/lf cr lf

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

Tu pourrais aussi faire

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

utiliser le ou les caractères de séparation de ligne par défaut du système.

0
aioobe

Cette méthode allouera un tableau de caractères, elle devrait être utilisée au lieu d’être itérée sur string.length () car length () utilise un nombre de caractères Unicode plutôt que des caractères.

int countChars(String str, char chr) {
    char[] charArray = str.toCharArray();
    int count = 0;
    for(char cur : charArray)
        if(cur==chr) count++;
    return count;
}
0
Ghandhikus
new StringTokenizer(str, "\r\n").countTokens();

Notez que cela ne comptera pas les lignes vides (\ n\n).

CRLF (\ r\n) compte comme un saut de ligne.

0
volley