J'ai la chaîne suivante qui contiendra probablement ~ 100 entrées: et je cherche à écrire la fonction suivante: p> Je voudrais faire cela sans utiliser aucune bibliothèque d'analyse. Des idées pour quelque chose de rapide? P> p>
7 Réponses :
Si vous savez que votre chaîne ressemblera toujours à cela, essayez quelque chose comme: AVERTISSEMENT: Je n'ai pas réellement essayé. Il pourrait y avoir des erreurs de syntaxe mineures, mais la logique devrait être sonore. Notez que j'ai également fait exactement la vérification des erreurs zéro, vous pouvez donc faire ce que j'ai fait plus robuste. P> p>
Un raccourci utiliserait ", = {}" code>. Aucun piratage d'accolades ou un deuxième jeton nécessaire :)
La réponse la plus rapide, mais la plus laide, je peux penser à analyser le caractère informatique par caractère à l'aide d'une machine à états. C'est très rapide, mais très spécifique et assez complexe. La façon dont je le vois, vous pourriez avoir plusieurs états:
Exemple: P>
int length = foo.length(); int state = READY; for (int i=0; i<length; ++i) { switch (state) { case READY: //Skip commas and brackets //Transition to the KEY state if you find a letter break; case KEY: //Read until you hit a = then transition to the value state //append each letter to a StringBuilder and track the name //Store the name when you transition to the value state break; case VALUE: //Read until you hit a , then transition to the ready state //Remember to save the built-key and built-value somewhere break; } }
Pour la vitesse brute, utilisez le tableau de caractères pour éviter la synchronisation. Eh bien, c'est un réflexe à l'ancienne depuis que les JVM modernes grossissent les serrures :-)
Oh, bon appel. En fait, j'ai complètement oublié de tomber dans la façon d'accéder aux personnages ...
écrit sans tests: oui, c'est laid: -) p> p>
Eh bien, en supposant no '=' ni ',' dans les valeurs, la méthode la plus simple (et minable) est la suivante: oueah, non recommandé :) p> p >
Ne pense pas que je vais utiliser celui-ci, mais une réponse intéressante!
Oh, je sais n'est pas le bon moyen :) Je voulais juste indiquer qu'il s'agit d'une méthode rapide. Mais certains utilisateurs sont plus rapides que moi et posté des solutions similaires auparavant. Je ne vois pas de bonnes solutions dans les autres réponses et la solution finale impliquerait d'utiliser un analyseur ast ou quelque chose de similaire.
Si la chaîne contient de nombreuses entrées, vous pourriez mieux analyser manuellement sans un StringTokenizer pour sauver une certaine mémoire (au cas où vous devriez analyser des milliers de ces chaînes, cela vaut le code supplémentaire):
public static Map parse(String s) { HashMap map = new HashMap(); s = s.substring(1, s.length() - 1).trim(); //get rid of the brackets int kpos = 0; //the starting position of the key int eqpos = s.indexOf('='); //the position of the key/value separator boolean more = eqpos > 0; while (more) { int cmpos = s.indexOf(',', eqpos + 1); //position of the entry separator String key = s.substring(kpos, eqpos).trim(); if (cmpos > 0) { map.put(key, s.substring(eqpos + 1, cmpos).trim()); eqpos = s.indexOf('=', cmpos + 1); more = eqpos > 0; if (more) { kpos = cmpos + 1; } } else { map.put(key, s.substring(eqpos + 1).trim()); more = false; } } return map; }
Ajout de code à vérifier l'existence de la touche code> in dans code> est laissée comme exercice au lecteur: -)
String foo = "{k1=v1,k2=v2,...}";
String getValue(String key){
int offset = foo.indexOf(key+'=') + key.length() + 1;
return foo.substring(foo.indexOf('=', offset)+1,foo.indexOf(',', offset));
}
S'il vous plaît trouver ma solution: utilisation p>
Ma bibliothèque d'analyse vous voulez dire regex ou aucune bibliothèque tierce partie?
Peut v1, v2 ... contenir '=' ou ','?
Permet de supposer que les valeurs ne contiennent pas '=' ou ','. Juste pas de bibliothèques tiers.
C'est vraiment vraiment proche de Json. Pourquoi ne pas utiliser ça?
(Aussi: pas de tiers libs à Java? Folie.)