2017-03-05 3 views
0

J'essaie d'utiliser StringTokenizer et de remplir 2 piles avec les éléments à l'intérieur de l'entrée String. J'essaie d'utiliser deux boucles if intégrées dans une boucle while pour remplir le bon type de jeton dans leurs piles respectives. Je me bats avec la façon de mettre en place un conditionnel pour déterminer le type. Voici ce que j'ai jusqu'ici.Comment déterminez-vous le type de jeton en Java?

Stack numbers = new Stack(); 
Stack operators = new Stack(); 
StringTokenizer token = new StringTokenizer(expr, delimiters, true); 

while(token.hasMoreTokens()){ 
    if(token.nextElement() ==){ 

    } 
    if(token.nextElement() ==){ 

    } 
} 
+0

1. N'appelez pas token.nextElement() plus d'une fois dans le corps de la boucle while. 2. Lisez http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java –

+0

n'utilisez pas '==' pour comparer les chaînes, utilisez plutôt '.equals (otherObject)' –

+0

Comme il semble que vous soyez nouveau sur ce site, je vous redirige vers [cette page d'aide] (http://stackoverflow.com/help/someone-answers). Vous devez essentiellement cliquer sur la coche verte à côté de la réponse bast pour marquer votre question comme résolue et récompenser le répondant. –

Répondre

0

Tout d'abord, vous ne devez pas utiliser == avec des chaînes. Merci d'utiliser .equals() à la place. Le problème suivant est que le jeton que vous comparez dans la première condition est un autre que celui dans la condition 2. token.nextToken() renvoie le premier jeton et le supprime également du Tokenizer.

Vous pouvez créer une variable temporaire qui stocke le premier élément. Vous pouvez ensuite utiliser celui-ci pour le comparer à quelque chose.

Stack numbers = new Stack(); 
Stack operators = new Stack(); 
StringTokenizer token = new StringTokenizer(expr, delimiters, true); 

while(token.hasMoreTokens()) { 
    String tmp = token.nextElement() 
    if(tmp.equals(...)){ 

    } 
    if(tmp.equals(...){ 

    } 
} 
+0

ok je pensais que le tokenizer juste fait le type tout ce que le compilateur pense que c'est (c'est à dire si ils voient 3 ils supposent int). Merci pour votre réponse! –

0

La réponse

Les jetons sont retournés en fait de chaînes, de sorte que vous pouvez faire les choses d'habitude avec eux. Je ne sais pas ce que vos besoins exacts ne sont que quelque chose comme cela devrait fonctionner:

List<String> operators = Arrays.asList("+", "-", "*", "/"); 
StringTokenizer token = ...; 

while(token.hasMoreTokens()){ 
    String next = token.nextElement(); 
    if(operators.contains(next)){ 
     //operator 
    } 
    else if(next.matches("\\d+")){ 
     //number 
    } 
    else { 
     //error? 
    } 
} 

tout d'abord vous devez utiliser un utiliser une variable pour le prochain jeton, nextElement() supprime également le jeton de la Tokenizer si vous devez le garder quelque part. Ensuite, nous pouvons déterminer le type en comparant la chaîne, ici je vérifie si elle fait partie d'une liste d'opérateurs prédéterminés et si elle correspond à la regex \d+, à savoir. si c'est un nombre.

Obsolescence

Le StringTokenizer JavaDoc dit qu'il a été dépréciée en faveur de String.split:

StringTokenizer est une classe héritage qui est retenu pour des raisons de compatibilité bien que son utilisation est déconseillée dans le nouveau code. Il est recommandé que quiconque recherche cette fonctionnalité utilise à la place la méthode split de la chaîne ou du package java.util.regex.

Je recommande donc de ne pas utiliser cette classe.

+0

cela fait partie d'un algorithme pour résoudre les expressions mathématiques qui sont entrées de gauche à droite (en ignorant l'ordre habituel des opérations). Merci pour votre réponse –