3 votes

Le résultat de Java split() varie lorsque l'on travaille avec une chaîne de nombres.

Pourquoi Java String.split() génère-t-il des résultats différents lorsque l'on travaille avec une chaîne de caractères définie dans le code et une chaîne de caractères lue dans un fichier lorsque des nombres sont impliqués ? Plus précisément, j'ai un fichier appelé "test.txt" qui contient des caractères et des nombres séparés par des espaces :

G H 5 4

La méthode split ne sépare pas les espaces comme prévu. Mais si une variable chaîne est créée dans le code avec les mêmes caractères et chiffres séparés par des espaces, alors le résultat de split() est quatre chaînes individuelles, une pour le caractère et le chiffre. Le code ci-dessous illustre cette différence :

   import java.io.File;
   import java.io.FileReader;
   import java.io.BufferedReader;

   public class SplitNumber {

     //Read first line of text file
     public static void main(String[] args) {
       try {
         File file = new File("test.txt");
         FileReader fr = new FileReader(file);
         BufferedReader bufferedReader = new BufferedReader(fr);

         String firstLine;
         if ((firstLine = bufferedReader.readLine()) != null) {
           String[] firstLineNumbers = firstLine.split("\\s+");
           System.out.println("First line array length: " + firstLineNumbers.length);

           for (int i=0; i<firstLineNumbers.length; i++) {
             System.out.println(firstLineNumbers[i]);
           }
         }
         bufferedReader.close();

         String numberString = "G H 5 4";
         String[] numbers = numberString.split("\\s+");
         System.out.println("Numbers array length: " + numbers.length);

         for (int i=0; i<numbers.length; i++) {
           System.out.println(numbers[i]);
         }
       } catch(Exception exception) {
         System.out.println("IOException occured");
         exception.printStackTrace();
       }
     }
   }

Le résultat est le suivant :

First line array length: 3
G
H
5 4
Numbers array length: 4
G
H
5
4

Pourquoi les nombres provenant du fichier ne sont-ils pas analysés de la même manière que la même chaîne définie dans le code ?

1voto

tpttpttpt Points 29

Sur la base des commentaires reçus, j'ai modifié l'expression rationnelle en la remplaçant par split("[\\s\\h]+") ce qui a permis de résoudre le problème ; les chiffres du fichier étaient correctement divisés, ce qui indiquait clairement que le fichier texte que j'utilisais contenait un caractère différent de l'espace blanc. J'ai ensuite remplacé le contenu du fichier (à l'aide du bloc-notes) et je suis revenu à l'option split("\\s+") et a constaté qu'il fonctionnait correctement cette fois-ci. Donc, à un moment donné, j'ai dû introduire des caractères blancs différents dans le fichier (peut-être un problème de copier/coller). En fin de compte, la conclusion est que je devrais utiliser split("[\\s\\h]+") lors de la lecture d'un fichier dans lequel je veux séparer les espaces, car cela couvre plus de scénarios qui ne sont pas forcément évidents au premier coup d'œil.

Merci à tous de m'avoir aidé à trouver la cause première de mon problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X