La necesidad de algunos compacto código para contar el número de líneas en una cadena en Java. La cadena es estar separados por \r o \n. Cada instancia de los caracteres de salto de línea, será considerado como una línea separada. Por ejemplo –

"Hello\nWorld\nThis\nIs\t"

debe volver 4. El prototipo es

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

Alguien puede proporcionar un conjunto compacto de declaraciones? Yo tengo una solución aquí, pero es demasiado largo, creo. Gracias.

  • ¿Qué sucede si la cadena termina con un salto de línea? Podría contar que como otra línea? Así, «foo\nbar\n» dos líneas o tres?
  • Otra manera con el JDK/11 es hacer uso de la String.lines() de la API.
InformationsquelleAutor Simon Guo | 2010-05-17

15 Comentarios

  1. 74
    private static int countLines(String str){
       String[] lines = str.split("\r\n|\r|\n");
       return  lines.length;
    }
    • Aunque esto es perfectamente buena para casi todos los casos de uso, sólo quiero señalar que esto crea una gran cantidad de Cadenas, que nunca están en muy buen estado usado – pero aún requiere de la memoria y de la gc-ing. Probablemente sólo un problema en un servidor muy utilizado, o un teléfono o algo, pero sigue siendo algo de un cludge.
    • Su no respuesta válida. No funciona si la Cadena contiene solo las nuevas líneas.
    • Si desea incluir trailing saltos de línea que usted tiene que pasar un argumento explícito de -1 para el parámetro de límite de la división (es decir str.split(«\r\n|\r|\n», -1); si usted mira la documentación aquí:docs.oracle.com/javase/7/docs/api/java/lang/… cuenta con más información.
    • También vale la pena destacar. Si utiliza StringUtils de apache commons, su versión de ‘split’ NO incluye el trailing saltos de línea. Incluso si se pasa un valor negativo para la longitud, detrás de la nueva línea todavía va a ser despojado.
    • un revestimiento de int count = text.split("\r\n|\r|\n").length;
    • desde java 1.1 hay una LineNumberReader. véase mi respuesta a continuación.

  2. 25

    Cómo sobre esto:

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

    De esta manera no es necesario dividir la Cadena en un montón de nuevos objetos de Cadena, que va a ser limpiado por el recolector de basura más tarde. (Esto sucede cuando se usa String.split(String);).

    • Debe líneas se inicializa a 0 aquí o 1?
    • A 1, ya que el primer carácter de nueva línea que se encuentra después de la línea 1.
    • La correcta expresión regular que debe ser (\r\n)|(\n)|(\r) de lo contrario este código devuelve 3 en lugar de 2 para «Primero\r\nSecond» porque coincide con \r y \n antes de coincidencia \r\n.
    • Oh, gracias! Buena captura! 🙂
    • gracias !!!!! Yo estaba buscando esta en un muy largo tiempo, y por fin he encontrado. Funcionaba perfectamente.
    • optimización sugerencia: precompilar el patrón de una vez : private static final Patrón EOL_PATTERN=Patrón.compile(«…»); fuera del método. Y utilizar en el método: Comparador m =EOL_PATTERN.combinador(yourinput);

  3. 16

    Una solución muy sencilla, que no crea objetos de Cadena, matrices u otros (complejo) de los objetos, es el uso de los siguientes:

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

    Tenga en cuenta que si se utilizan otros EOL terminadores necesita modificar este ejemplo un poco.

  4. 10

    Si usted tiene las líneas en el archivo ya en una cadena, se puede hacer esto:

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

    EDICIÓN:

    Sólo en caso de que usted necesite para leer el contenido de un archivo (yo sé que usted dijo que no, pero esto es para referencia en el futuro), recomiendo el uso de Apache Commons para leer el contenido del archivo en una cadena. Es una gran biblioteca y tiene muchos otros métodos útiles. He aquí un ejemplo simple:

    import org.apache.commons.io.FileUtils;
    
    int getNumLinesInFile(File file) {
    
        String content = FileUtils.readFileToString(file);
        return content.split(System.getProperty("line.separator")).length;
    }
    • La línea no es de un archivo, es sólo una cadena. Pero es un buen aunque el código
    • No debería el FileUtils.readFileToString(archivo) parámetro de java.io.Archivo de ejemplo, el código anterior es el paso de una Cadena (estoy usando Commons-io 2.4)?
    • Sí, estás en lo correcto. Gracias por señalarla, he corregido el código.
    • Este código no funcionará si usted recibe un archivo creado en Windows y su JVM en un so linux, y de la otra manera no va a funcionar tan bien. Si usted puede asumir que los archivos están en el formato del sistema operativo que está ejecutando la máquina virtual, que está bien.
    • Eso es más de un tipo general del problema. Usted debe fijar los finales de línea para ser aplicable para el OS antes de intentar analizar el archivo. O, si usted sabe que el archivo está en un formato de Windows (por ejemplo, usted sabe que el final de línea tipo), se podría codificar para que así. Yo realmente no creo que una razón para downvote mi respuesta, pero usted tiene derecho a su opinión.
  5. 4

    Si el uso de Java 8, entonces:

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

    (+1 en la final es contar la última línea, si la cadena es recortado)

    Una línea de solución

  6. 4

    Con JDK/11 se puede hacer lo mismo con la String.líneas() API de la siguiente manera :

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

    La API de doc de los estados, el siguiente como parte de la descripción:-

    Returns:
    the stream of lines extracted from this string
  7. 3

    Esta es una versión más 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;
    }
  8. 1

    Probar 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 líneas = countLineEndings(str) + 1

    Saludos 🙂

  9. 1
    //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;
    }

    Se tendrá en cuenta la última línea si no termina en cr/lf cr lf

  10. 0

    Bien, esta es una solución sin usar «magia», expresiones regulares, o en otras complejas funciones de sdk.

    Obviamente, el regex comparador es probablemente mejor usar en la vida real, como su más rápido para escribir. (Y es probable que sea libre de errores demasiado…)

    Por otro lado, Usted debería ser capaz de entender lo que pasa aquí…

    Si quieres manejar el caso \r\n como una nueva línea (en ms-dos convención) usted tiene que agregar su propio código. Sugerencia, necesita otra variable que lleva la cuenta del carácter anterior igualado…

    int lines= 1;
    
    for( int pos = 0; pos < yourInput.length(); pos++){
        char c = yourInput.charAt(pos);
        if( c == "\r" || c== "\n" ) {
            lines++;
        }
    }
    • ¿Qué pasa si las líneas están separadas por «\r\n» como está en la plataforma de windows? su método se doble el número de línea
    • Como esta es probablemente la tarea, que acabo de mencionar que el caso en la respuesta. Usted encontrará que es de arriba…
  11. 0
    new StringTokenizer(str, "\r\n").countTokens();

    Tenga en cuenta que esto no va a contar las líneas vacías (\n\n).

    CRLF (\r\n) cuenta como un solo salto de línea.

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

    También podría hacer

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

    el uso de los sistemas de línea por defecto carácter de separación(s).

    • si se debe trabajar correctamente con archivos, a continuación, sería System.getProperty ("line.separator");. Pero pienso que no es el caso y el anterior (antes de editar) solución era correcta.
    • ah buen punto .
  13. 0

    Este método se asigne una matriz de caracteres, que debe ser usado en lugar de iterar sobre cadena.longitud() como la longitud() utiliza el número de caracteres Unicode en lugar de caracteres.

    int countChars(String str, char chr) {
        char[] charArray = str.toCharArray();
        int count = 0;
        for(char cur : charArray)
            if(cur==chr) count++;
        return count;
    }
  14. -2

    Le sugiero que busque algo como esto

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

    Busque las instrucciones aquí para Java String método Split

    Si usted tiene cualquier problema, publicar su código

    • Esto no funciona ya que sólo se divide en la secuencia de \n\r.
    • Sí, no funciona. Debe ser una regrex allí. La recomiendo como una sugerencia en lugar de una aplicación real:)
    • sí, yo creo que Tim código funciona bien.

Dejar respuesta

Please enter your comment!
Please enter your name here