51 votes

Sortie confuse de String.split

Je ne comprends pas le résultat de ce code :

public class StringDemo{              
    public static void main(String args[]) {
        String blank = "";                    
        String comma = ",";                   
        System.out.println("Output1: "+blank.split(",").length);  
        System.out.println("Output2: "+comma.split(",").length);  
    }
}

Et j'ai obtenu le résultat suivant :

Output1: 1 
Output2: 0

2voto

Pham Trung Points 1706

À partir du JDK 1.7

 public String[] split(String regex, int limit) {
        /* fastpath if the regex is a
           (1)one-char String and this character is not one of the
              RegEx's meta characters ".$|()[{^?*+\\", or
           (2)two-char String and the first char is the backslash and
              the second is not the ascii digit or ascii letter.
        */
        char ch = 0;
        if (((regex.count == 1 &&
             ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
              ((ch-'a')|('z'-ch)) < 0 &&
              ((ch-'A')|('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))
        {
            int off = 0;
            int next = 0;
            boolean limited = limit > 0;
            ArrayList<String> list = new ArrayList<>();
            while ((next = indexOf(ch, off)) != -1) {
                if (!limited || list.size() < limit - 1) {
                    list.add(substring(off, next));
                    off = next + 1;
                } else {    // last one
                    //assert (list.size() == limit - 1);
                    list.add(substring(off, count));
                    off = count;
                    break;
                }
            }
            // If no match was found, return this
            if (off == 0)
                return new String[] { this };

            // Add remaining segment
            if (!limited || list.size() < limit)
                list.add(substring(off, count));

            // Construct result
            int resultSize = list.size();
            if (limit == 0)
                while (resultSize > 0 && list.get(resultSize-1).length() == 0)
                    resultSize--;
            String[] result = new String[resultSize];
            return list.subList(0, resultSize).toArray(result);
        }
        return Pattern.compile(regex).split(this, limit);
    }

Donc, dans ce cas, l'expression rationnelle sera traitée par la première fonction if .

Pour le premier cas blank.split(",")

// If no match was found, return this
if (off == 0)
   return new String[] { this };

Ainsi, cette fonction retournera un tableau qui contient un élément s'il n'y a pas de correspondance.

Pour le deuxième cas comma.split(",")

List<String> list = new ArrayList<>();
//...
int resultSize = list.size();
if (limit == 0)
    while (resultSize > 0 && list.get(resultSize-1).length() == 0)
           resultSize--;
String[] result = new String[resultSize];
return list.subList(0, resultSize).toArray(result);

Comme vous pouvez le constater, la dernière boucle while a supprimé tous les éléments vides à la fin de la liste, de sorte que la taille du résultat est la suivante 0 .

1voto

String blank = "";                    
String comma = ",";                   
System.out.println("Output1: "+blank.split(",").length);  // case 1
System.out.println("Output2: "+comma.split(",").length);  // case 2

cas 1 - Ici blank.split(",") retournera "" puisqu'il n'y a pas de , sur blank vous obtenez la même chose, donc la longueur sera 1

cas 2- Ici comma.split(",") retournera un tableau vide, vous devez vous débarrasser de , si vous voulez compter comma avec la longueur 1 sinon la longueur sera 0

Encore une fois comma.split(",") split() qui attend un regex en tant qu'argument, il retournera un tableau de résultats pour correspondre à ce tableau regex .

Le tableau retourné par cette méthode contient chaque sous-chaîne de ce code. chaîne de caractères qui est terminée par une autre sous-chaîne correspondant à l'expression donnée ou qui se termine par la fin de la chaîne.

Else

Si l'expression ne correspond à aucune partie de l'entrée, alors le tableau résultant n'a qu'un seul élément, à savoir cette chaîne. tableau résultant n'a qu'un seul élément, à savoir cette chaîne.

1voto

Ralf Wagner Points 495

L'API de la méthode split indique que "Si l'expression ne correspond à aucune partie de l'entrée, le tableau résultant ne comporte qu'un seul élément, à savoir cette chaîne".

Ainsi, comme la chaîne blank ne contient pas de ",", une chaîne[] avec un élément (c'est-à-dire blank lui-même) est renvoyée.

Pour la virgule de la chaîne de caractères, "rien" n'est laissé de la chaîne de caractères originale, donc un tableau vide est retourné.

Cela semble être la meilleure solution si vous voulez traiter le résultat renvoyé, par exemple.

String[] splits = aString.split(",");
for(String split: splits) {
   // do something
}

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