web-dev-qa-db-fra.com

Comment diviser une chaîne délimitée par des virgules en un tableau de chaînes vides

Je souhaite diviser ",,," En un tableau de 4 "" En utilisant la fonction String.split()

Voici mon code:

String str = ",,,";     
String[] tokens = str.split(",");

Cependant, les jetons de résultat étaient un tableau vide: [], plutôt qu'un tableau de 4 ""(["","","",""]) Comme je le voulais.

J'ai testé pour changer un peu le str:

String str = ",,,1";        
String[] tokens = str.split(",");

Cette fois, les jetons de résultat étaient ["","","","1"]. C'est proche de ce que je veux, mais je ne veux vraiment pas ajouter ce "1" avant de faire le split.

Le problème est fondamentalement, la String.split() renverra un tableau vide s'il ne contient que des éléments vides "".

Pouvez-vous aider à résoudre le problème?

16
Changwang Zhang

Vous devez utiliser la méthode String#split(regex, limit) surchargée qui accepte le paramètre limit.

String[] tokens = str.split(",", -1);

De la docs (accent sur le mien):

Le paramètre limit contrôle le nombre de fois que le motif est appliqué et affecte donc la longueur du tableau résultant. Si la limite n est supérieure à zéro, le modèle sera appliqué au plus n - 1 fois, la longueur du tableau ne sera pas supérieure à n et la dernière entrée du tableau contiendra toutes les entrées au-delà du dernier délimiteur correspondant. Si n est non positif, le motif sera appliqué autant de fois que possible et le tableau peut avoir n'importe quelle longueur. Si n est zéro, alors le motif sera appliqué autant de fois que possible, le tableau peut avoir n'importe quelle longueur et les chaînes vides de fin seront ignorées.


Explication: Lorsque vous ne fournissez pas l'argument limit ou n'indiquez "zéro" comme limite, la split() ignore les champs vides à la fin. Lorsque vous fournissez un argument de limite positive, il limite le nombre de champs à cette limite particulière. Mais lorsque vous fournissez une limite négative, la méthode split() autorise n'importe quel nombre de champs et ne supprime pas non plus les champs vides de fin. Pour être plus clair, jetez un œil au code source de Pattern#split(regex, limit) qui a cet extrait à la fin (des commentaires ont été ajoutés par moi et n'étaient pas présents dans la source réelle code).

if (limit == 0) // When zero or no arg is given
    while (resultSize > 0 && matchList.get(resultSize-1).equals("")) // if trailing entries are blank
        resultSize--; // remove them out

Remarque: Si vous ne fournissez aucun argument limit, la méthode split() sans argument limit appelle la méthode split() surchargée comme celle-ci .

public String[] split(String regex) {
    return split(regex, 0);
}

Et notez également que String#split(regex, limit) appelle en interne Pattern#split(regex, limit) .

37
SudoRahul