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 est d'être séparés par r ou n. Chaque instance de ces caractères newline sera considérée comme une ligne séparée. Par exemple -

"HellonWorldnThisnIst"

devrait retourner 4. Le prototype est

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

quelqu'un Peut-il fournir un ensemble compacte de déclarations? J'ai une solution ici, mais c'est trop long, je pense. Remercier.

37
demandé sur nullpointer 2010-05-17 19:08:47

15 réponses

private static int countLines(String str){
   String[] lines = str.split("\r\n|\r|\n");
   return  lines.length;
}
65
répondu Tim Schmelter 2010-05-17 15:14:38

Que Diriez-vous de ceci:

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 corde en beaucoup de nouveaux objets de corde, qui seront nettoyés par le collecteur d'ordures plus tard. (Cela se produit lors de l'utilisation de String.split(String);).

24
répondu Martijn Courteaux 2015-10-14 17:52:51

une solution très simple, qui ne crée pas D'objets String, tableaux ou autres objets (complexes), est d'utiliser ce qui suit:

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 de fin de vie, vous devez modifier un peu cet exemple.

15
répondu Veger 2015-05-04 20:55:23

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;

EDIT:

juste au cas où vous auriez besoin de lire le contenu d'un fichier (je sais que vous avez dit que vous ne l'avez pas fait, mais ceci est pour référence future), je recommande d'utiliser Apache Commons lire le contenu du fichier dans une chaîne. C'est une grande bibliothèque et a beaucoup d'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
répondu dcp 2013-05-24 13:50:30

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 dans le java.io Paquet:https://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html

6
répondu dermoritz 2018-01-02 20:12:56

C'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
répondu Saxintosh 2012-02-06 13:46:53

si vous utilisez Java 8 alors:

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

(+1 à la fin est à compter de la dernière ligne si la chaîne est tronquée)

Une solution en ligne

3
répondu Gleb S 2018-01-12 09:44:02

Essayez celui-ci:

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
répondu Zephram 2017-06-02 16:07:30

avec JDK / 11 Vous pouvez faire la même chose en utilisant le String.lines() API comme suit :

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

La doc API stipule ce qui suit comme une partie de la description:-

   ...
 * @return  the stream of strings extracted from this string
 *          partitioned by line terminators
 *
 * @since 11
 */
public Stream<String> lines()
1
répondu nullpointer 2018-05-31 19:23:04

Eh bien, c'est une solution qui n'utilise pas de regexe "magique", ou d'autres fonctionnalités sdk complexes.

évidemment, le matcher regex est probablement mieux à utiliser dans la vie réelle, comme son plus rapide à écrire. (Et il est probablement libre de bug aussi...)

d'un autre côté, vous devriez être capable de comprendre ce qui se passe ici...

si vous voulez gérer le cas \r\n Comme une seule nouvelle ligne (msdos-convention), vous devez ajouter votre propre code. Indice, vous avez besoin d'une autre variable qui conserve piste du personnage 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
répondu KarlP 2010-05-17 16:00:09
new StringTokenizer(str, "\r\n").countTokens();

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

CRLF (\r\n) compte comme rupture de ligne simple.

0
répondu volley 2010-05-17 18:49:44
"Hello\nWorld\nthis\nIs\t".split("[\n\r]").length

Vous pouvez aussi faire

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

pour utiliser les systèmes de ligne par défaut caractère séparateur(s).

0
répondu aioobe 2013-09-15 18:54:25

cette méthode va allouer un tableau de caractères, il devrait être utilisé au lieu d'itérer sur la chaîne.longueur() length() utilise le nombre de caractères Unicode plutôt que de 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
répondu Sonny 2016-12-17 21:19:50
//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;
}

cela comptera la dernière ligne si elle ne finit pas en cr/lf cr lf

0
répondu Tech Wanker 2018-08-05 14:27:41

je vous suggère de regarder pour quelque chose comme ceci

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

cherchez les instructions ici pour la méthode de dédoublement de chaîne de caractères de Java

Si vous avez un problème, postez votre code

-2
répondu vodkhang 2010-05-17 15:16:33