2016-08-01 2 views
1

Этот мой код, когда я его выполняю, показывает мне размер 3, но когда я выхожу из объекта, я получаю только 2 объекта. Пожалуйста, объясните мне, не делаю ли я это неправильно? , и я хочу знать, какие объекты хранятся в ValueStack и как я могу получить эти объекты?Какие объекты хранятся в 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

Вы подталкивают ** один ** объект в стек значение: 'context': | –

+0

yes im push только один объект, а другой объект в стеке значений - это объект действия, поэтому он означает, что есть только 2 объекта, поэтому размер стека значений должен быть 2, но он дает мне 3 в качестве размера объекта , вот о чем я беспокоюсь, я хочу знать, почему он показывает размер 3? –

+3

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он раскрывает проблему [XY] (http://meta.stackexchange.com/q/66377/208138). –

ответ

2

Вы плохо обращались с контекстом и картой. Сначала вы получили контекст действия и valueStack. Затем вы создали карту с именем context и перетащили ее в стек. Затем вы начали перебирать стек, но стек - это другой объект, который имеет context. Чтобы вернуть свой контекст из стека, вам необходимо: pop() или peek() от valueStack. Затем вы можете повторить его как Map.

Код:

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

+0

на самом деле я взял меня неправильно. что моя точка зрения заключается в том, что когда я печатаю размер объекта, он дает 3 как вывод, но когда я всплываю объект из стека значений, я получаю только 2 объекта. На самом деле хотите понять, какие объекты хранятся в стеке значений, а im только получает 2 объекта –

+0

вы печатаете размер стека, а не размер объекта в стеке –

+0

, используя stack.pop() im, пытающийся извлечь объект в стеке , но в любом случае спасибо, я получил свой ответ –

1

Есть две ошибки в коде, которые мешают результат быть напечатаны правильно.


n.1 Ошибка

i <= stack.size() должен быть i < stack.size(), в противном случае с 3-х элементов, которые вы будете пытаться напечатать 4 элементов (i 0 на основе size() является 1-основе).
Вы не сталкиваетесь с этой ошибкой из-за ошибки n.2.


n.2 Ошибка

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

.pop(): Получить объект на вершине стека и удалить его из стека.

Вы должны затем сохранить размер до цикла, так как в противном случае размер изменений стека на каждой итерации.

Это то, что происходит:

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. 

Рабочий код (ы)

int size = stack.size(); 

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

Это правильно напечатать результат, однако он изменяет стек значение; чтобы предотвратить это, вы должны цикла объектов стек значений изнутри итератора, что вы можете получить с помощью метода getRoot():

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

спасибо за то, что указали это, но это то, что я пытаюсь проверить, выбрасывает ли оно какое-либо исключение или нет, и будем рады узнать, что оно не выбрасывало никаких исключений. другое дело, нужно отметить, что я не использую i, а peek возвращает только самый верхний элемент в стеке –

+0

спасибо mate, но в случае pop() также он не будет вызывать никаких исключений. но это было не мое беспокойство, и я получил свой ответ, используя метод getroot(), и он дал мне 3 объекта, которые находятся в оценочной таблице, и это [{key3 = Это ключ3, key2 = Это key2, key1 = Это ключ1}, [email protected], [email protected]] спасибо за помощь –

+0

@SachinSingh У вас есть тот же объект, и размер не изменился, потому что 'valueStack' является нитью -безопасно. Вы просто используете другой метод для извлечения объекта, но API тот же, с исключением, что у вас много ошибок в программировании кода Java. –

Смежные вопросы