J'essaye d'analyser une chaîne récursivement avec StringTokenizer
. La chaîne représente un arbre, sous la forme:Parse string récursivement avec StringTokenizer
[(0,1),[(00,01,02),[()],[()]]]
où l'information du noeud est stocké à l'intérieur de la parenthèse, tandis que les crochets sont les enfants d'un noeud, séparés par des virgules. Par exemple, cette chaîne représente cet arbre:
Si un nœud a quelque chose dans la parenthèse, il est un noeud normal, si elle n'a rien, il est une feuille.
J'ai écrit le code ci-dessous pour l'analyser, et cela fonctionne bien mais quand la récursivité se termine, il semble que le tokenizer n'a aucun autre jeton à analyser. Le problème est que lorsqu'il rencontre les dernières parenthèses (]]]
) il saute directement au dernier en sautant les autres.
import java.util.*;
public class ParseString
{
public void setParameters(String parameters) throws Exception {
setParameters(new StringTokenizer(parameters, "[(,)]", true));
}
public void setParameters(StringTokenizer tokenizer) throws Exception{
String buf;
try{
if (!(buf = tokenizer.nextToken()).equals("["))
throw new Exception("Malformed string, found " + buf + "instead of [");
boolean isLeaf = setWeights(tokenizer);
System.out.println("Leaf: " + isLeaf);
while (!(buf = tokenizer.nextToken()).equals("]")) {
do{
setParameters(tokenizer);
}while (!(tokenizer.nextToken().equals("]")));
if (!(buf = tokenizer.nextToken()).equals(","))
break;
}
}catch(Exception e){e.printStackTrace();}
}
public boolean setWeights(StringTokenizer tokenizer) throws
Exception{
String buf;
if(!(buf = tokenizer.nextToken()).equals("("))
throw new Exception("Malformed string, found "+ buf + "instead of (");
do{
buf = tokenizer.nextToken();
if(buf.equals(")")){
return true;
}
if(!buf.equals(","))
System.out.println(buf);
}while(!tokenizer.nextToken().equals(")"));
return false;
}
public static void main(String[] args)
{
ParseString ps = new ParseString();
try{
ps.setParameters("[(0,1),[(00,01,02),[()],[()]]]");
}catch(Exception e){e.printStackTrace();}
}
}
C'est la sortie je l'exécuter:
0
1
Leaf: false
00
01
02
Leaf: false
Leaf: true
Leaf: true
java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at ParseString.setParameters(ParseString.java:22)
at ParseString.setParameters(ParseString.java:7)
at ParseString.main(ParseString.java:51)
Une autre chose: l'analyseur doit être en mesure d'analyser un arbre générique, non seulement celui-ci. Si quelqu'un peut résoudre ce problème, je serai heureux.
Merci pour la réponse, mais je suis tout à fait forcé de maintenir la structure comme ci-dessus. La raison en est que je dois faire beaucoup plus de choses alors juste extraire les poids et les montrer.Mais votre solution est très bonne! – GianniPele