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.
15 réponses
private static int countLines(String str){
String[] lines = str.split("\r\n|\r|\n");
return lines.length;
}
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);
).
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.
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;
}
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
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;
}
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
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 :)
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()
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++;
}
}
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.
"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).
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;
}
//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
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