68 votes

Comment empêcher java.lang.String.split () de créer une chaîne vide principale?

passage de 0 comme limite de l'argument empêche la fuite des chaînes vides, mais comment fait-on prévenir le leader des chaînes vides?

par exemple

String[] test = "/Test/Stuff".split("/");

résultats dans un tableau avec "", "Test", "Trucs".

Ouais, je sais que je pourrais rouler mon propre générateur de jetons... mais l'API docs pour StringTokenizer dire

"StringTokenizer est un héritage de la classe qui est conservé pour la compatibilité raisons même si son utilisation est déconseillée dans le nouveau code. Il est recommandé de que toute personne à la recherche de cette fonctionnalité, utilisez le split"

51voto

Joe Attardi Points 628

Votre meilleur pari consiste probablement simplement à éliminer tout délimiteur principal:

 String input = "/Test/Stuff";
String[] test = input.replaceFirst("^/", "").split("/");
 

Vous pouvez le rendre plus générique en le mettant dans une méthode:

 public String[] mySplit(final String input, final String delim)
{
    return input.replaceFirst("^" + delim, "").split(delim);
}

String[] test = mySplit("/Test/Stuff", "/");
 

23voto

adranale Points 1555

Apache Commons a une méthode utilitaire pour exactement ceci: org.apache.commons.lang.StringUtils.split

StringUtils.split ()

En fait, dans notre société, nous préférons maintenant utiliser cette méthode pour scinder tous nos projets.

6voto

Hunter McMillen Points 17717

Je ne pense pas qu'il y est une façon pour vous de le faire avec le haut- split méthode. Donc, vous avez deux options:

1) Faire votre propre split

2) parcourir le tableau après l'appel de split et de supprimer les éléments vides

Si vous faites votre propre split, vous pouvez simplement combiner ces deux options

public List<String> split(String inString)
{
   List<String> outList = new ArrayList<>();
   String[]     test    = inString.split("/");

   for(String s : test)
   {
       if(s != null && s.length() > 0)
           outList.add(s);
   }

   return outList;
}

ou vous pouvez vérifier pour le délimiteur d'être dans la première position, avant d'appeler split et ignorer le premier personnage si il n':

String   delimiter       = "/";
String   delimitedString = "/Test/Stuff";
String[] test;

if(delimitedString.startsWith(delimiter)){
    //start at the 1st character not the 0th
    test = delimitedString.substring(1).split(delimiter); 
}
else
    test = delimitedString.split(delimiter);

1voto

codeit Points 5108

Je pense qu'il n'y a pas de fonction intégrée pour supprimer une chaîne vide en Java. Vous pouvez éliminer la suppression de chaîne vide, mais cela peut entraîner des erreurs. Pour plus de sécurité, vous pouvez le faire en écrivant un petit morceau de code comme suit:

   List<String> list = new ArrayList<String>();

  for(String str : test) 
  {
     if(str != null && str.length() > 0) 
     {
         list.add(str);
     }
  }

  test = stringList.toArray(new String[list.size()]);
 

0voto

Voici comment j'ai résolu ce problème. Je prends la chaîne, appelle .toCharArray () dessus pour la scinder en un tableau de caractères, puis parcourt ce tableau et l'ajoute à ma liste de chaînes (encapsulant chaque caractère avec String.valueOf). J'imagine qu'il y a un compromis entre performances, mais cela semble être une solution lisible. J'espère que cela t'aides!

  char[] stringChars = string.toCharArray(); 
 List<String> stringList = new ArrayList<>(); 

 for (char stringChar : stringChars) { 
      stringList.add(String.valueOf(stringChar)); 
 }
 

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