2016-08-01 3 views
1

Ce mon code, quand je l'exécute me montre la taille 3, mais quand je pop l'objet découvert que je reçois seulement deux objets. Veuillez m'expliquer si je me trompe? et je veux savoir que ce sont les objets stockés dans ValueStack et comment puis-je récupérer ces objets?Quels objets sont stockés dans ValueStack

import java.util.*; 
import com.opensymphony.xwork2.util.ValueStack; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 

public class HelloWorldAction extends ActionSupport { 

    private static final long serialVersionUID = 1L; 
    private String name; 

    public String execute() throws Exception { 
     ValueStack stack = ActionContext.getContext().getValueStack(); 
     Map<String, Object> context = new HashMap<String, Object>(); 

     context.put("key1", new String("This is key1")); 
     context.put("key2", new String("This is key2")); 
     context.put("key3", new String("This is key3")); 
     stack.push(context); 

     System.out.println("Size of the valueStack: " + stack.size()); 

     for (int i = 0; i < stack.size(); i++) { 
      System.out.println(i + ": " + stack.pop().toString()); 
     } 
     return "success"; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+1

Vous poussiez ** un ** objet sur la pile de valeurs: 'context': | –

+0

oui je ne pousse qu'un seul objet et l'autre objet dans la pile de valeur est l'objet action donc ça veut dire qu'il n'y a que 2 objets donc la taille de la pile de valeur devrait être 2, mais ça me donne 3 comme la taille de l'objet , c'est ce que ma préoccupation est que je veux savoir pourquoi montre-t-elle la taille 3? –

+3

Je vote pour fermer cette question hors-sujet car elle expose [problème XY] (http://meta.stackexchange.com/q/66377/208138). –

Répondre

2

Vous avez mal soigné le contexte et la carte. D'abord vous avez un contexte d'action et valueStack. Ensuite, vous avez créé une carte appelée context et l'avez poussé vers la pile. Ensuite, vous avez commencé à itérer sur la pile, mais la pile est un objet différent qui a context poussé plus. Pour obtenir votre contexte de retour de la pile, vous devez pop() ou peek() depuis le valueStack. Ensuite, vous pouvez itérer comme Map.

Le code:

context = (Map<String, Object>)stack.pop(); 
for (Map.Entry<String, Object> entry : context.entrySet()) { 
    System.out.println(entry.getKey() + ": " + entry.getValue()); 
} 

+0

en fait vous m'avez pris mal. ce que mon point est que quand j'imprime la taille de l'objet il donne 3 comme sortie mais quand j'ouvre l'objet de la pile de valeur je reçois seulement 2 objet. En fait, vous voulez comprendre quels objets sont stockés dans la pile de valeur et que j'obtiens seulement 2 objets –

+0

vous imprimez la taille de la pile, pas la taille de l'objet dans la pile –

+0

en utilisant stack.pop() im essayant de récupérer l'objet dans la pile . mais de toute façon merci j'ai eu ma réponse –

1

Il y a deux erreurs dans votre code, qui empêchent le résultat à imprimer correctement.


Erreur n.1

i <= stack.size() devrait être i < stack.size(), sinon avec 3 éléments que vous allez essayer d'imprimer 4 éléments (i est basée 0, size() est basé sur 1).
Vous n'êtes pas rencontrez cette erreur en raison de n.2 d'erreur.


Erreur n.2

System.out.println(i + ": " + stack.pop().toString()); 

.pop(): Obtenez l'objet sur le dessus de la pile et retirer il de la pile.

Vous devriez alors stocker la taille avant la boucle, car sinon la taille des changements de pile à chaque itération.

C'est ce qui se passe:

for (int i = 0; i <= 3; i++) { 

for (int i = 1; i <= 2; i++) { 

for (int i = 2; i <= 1; i++) { // not performed. And you don't fall in error n.1. 

Code de travail (s)

int size = stack.size(); 

for (int i = 0; i < size; i++) { 
    System.out.println(i + ": " + stack.pop().toString()); 
} 

Cela affichera correctement le résultat, mais il modifiera la pile de valeurs; pour éviter cela, vous devez boucle les objets de la pile de valeurs à partir d'un iterator, que vous pouvez obtenir avec la méthode getRoot():

Iterator itr = stack.getRoot().iterator(); 
while (itr.hasNext()) { 
    System.out.println(itr.next().toString()); 
    // or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever... 
} 
+0

merci d'avoir souligné cela, mais ce que j'essaie de vérifier si elle jette une exception ou non et je serai heureux de savoir qu'il ne lançait aucune exception. une autre chose u besoin de noter que je n'utilise pas i et peek renvoie juste le plus haut élément de la pile –

+0

merci mate mais dans le cas de pop() aussi, il ne jettera aucune exception. mais ce n'était pas mon problème et j'ai obtenu ma réponse en utilisant la méthode getroot() et il m'a donné les 3 objets qui sont dans la valeur de la propriété et ce sont [{key3 = Ceci est key3, key2 = Ceci est key2, key1 = Ceci est key1}, [email protected], [email protected]] merci pour l'aide –

+0

@SachinSingh Vous avez le même objet et la taille n'a pas changé car 'valueStack' est le fil -sûr. Vous utilisez simplement une autre méthode pour récupérer l'objet mais l'API est la même, sauf que vous avez beaucoup d'erreurs dans la programmation du code Java. –