3 votes

Une manière efficace d'analyser la chaîne suivante ?

Je reçois la réponse suivante d'un serveur sous forme de chaîne...

valeur_un=3342342&valeur_deux=456344445&valeur_trois=235333223

Quelle serait une façon efficace de la parser ? Tout ce à quoi je peux penser est assez désordonné.

6voto

Joe Points 34413

Divisé sur '&', boucle, divisé sur '='

public static Map getQueryMap(String query)
{
    String[] params = query.split("&");
    Map map = new HashMap();
    for (String param : params)
    {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

1voto

Eugene Kuleshov Points 17757

Si vous prévoyez d'analyser plusieurs chaînes, alors utiliser à plusieurs reprises la méthode String.split() n'est pas une bonne idée, car cela recompilerait l'expression régulière à chaque fois.

Pattern ampPattern = Pattern.compile("&");
Pattern eqPattern = Pattern.compile("=");
...

Map results = new HashMap();
for (String param : ampPattern.split(input)) {
  String[] pair = eqPattern.split(param);
  results.put(pair[0], Long.valueOf(pair[1]));
}

Cependant, pour une chaîne d'entrée aussi simple, il serait encore plus efficace de ne pas utiliser du tout d'expressions régulières et d'éviter la création de tableaux de chaînes temporaires. Peut-être quelque chose comme ceci :

Map results = new HashMap();
int start = 0;
int next;
do {
  next = input.indexOf('&', start);
  int end = next == -1 ? input.length() : next;
  int k = input.indexOf('=', start);
  results.put(input.substring(start, k), Long.valueOf(input.substring(k + 1, end)));
  start = next + 1;
} while (next > -1);

Bien sûr, si vous ne parsez cette chaîne que quelques fois, une telle optimisation peut ne pas en valoir la peine.

0voto

Bhaskar Points 3314

Tout d'abord, divisez la chaîne sur un "&". Cela vous donnera des jetons, chacun étant constitué d'une paire nom-valeur avec un "=" les séparant. Divisez-les ensuite sur "=" comme requis. Cela me semble très simple à moins que vous n'ayez d'autres exigences.

0voto

Andrzej Doyle Points 52541

Une approche naïve est d'utiliser simplement String.split:

String input = "value_one=3342342&value_two=456344445&value_three=235333223"
String[] rawAttrs = input.split("&");

// Diviser chaque attribut en paires - supposez qu'une sorte de classe Pair existe
List> attributes = new ArrayList>();
for (String rawAttr : rawAttrs) {
    String[] parts = rawAttrs.split("=");
    attributes.add(new Pair(parts[0], parts[1]);
}

Cette approche ne gère pas bien les entrées mal formées - mais plus important encore, elle ne tient pas compte de ce qui se passe si une partie des valeurs des attributs inclut un caractère = ou &. Sont-ils échappés par un antislash? Sont-ils encodés en URL? Existe-t-il une autre façon dont ils pourraient être intégrés?

Si vous pouvez garantir que les valeurs sont des entiers, alors cela ne posera pas de problème, mais vous devez vous assurer que toutes les bases sont couvertes.

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