【发布时间】:2011-05-17 00:37:57
【问题描述】:
晚上好,
我尝试在 Java 上实现的方法有一个奇怪的问题。 我会尽量描述它:
基本上,它所做的是检查 Epsilon-Non Deterministic State Machine 将达到的下一个状态,给定一个状态和一系列可能的转换。 “loadEpsilon(List)”方法为给定的状态列表加载可能的 epsilon 转换。
if (transitionList.isEmpty()){
return new HashSet<State>(stateEntryList);
}
else{
for (int i=0; i <= transitionList.size()-1; i++){
for (int j=0; j <= stateEntryList.size()-1; j++){
for (Transition tr : this.transitions()){
if ((tr.fromState() == stateEntryList.get(j)) && (tr.label() == transitionList.get(i))){
if (!stateExitList.contains(tr.toState())){
stateExitList.add(tr.toState());
}
}
}
}
stateEntryList.clear();
stateEntryList = loadEpsilon(stateExitList);
stateExitList.clear();
}
return new HashSet<State>(stateEntryList);
}
所以,用跟踪“System.out.print”来填充整个代码,直到
stateExitList.clear();
一切正常。但是,经过该行,我在该句子之后打印两个列表(StateExitList 和 StateEntryList),它们都已消失。
我只是想不通他们为什么要清空自己。
有没有帮助的机会?
非常感谢。
编辑:这将是 loadEpsilon 的代码:
public List<State> loadEpsilon(List<State> states) throws NoInitialStateException{
State stateRead;
if (states.isEmpty()){
if (this.getInitialState() == null){
throw new NoInitialStateException();
}
states.add(this.getInitialState());
return loadEpsilon(states);
}
else{
for (int i=0; i <= states.size()-1;i++){
stateRead = states.get(i);
for (Transition tr : this.transitions()){
if ((tr.fromState() == stateRead) && (tr.label().isEpsilon()) && (!states.contains(tr.toState()))){
states.add(tr.toState());
System.out.print(states.size());
}
}
}
}
return states;
}
列表的声明如下:
List<State> stateEntryList = new ArrayList<State>();
stateEntryList = loadEpsilon(stateEntryList);
List<State> stateExitList = new ArrayList<State>();
List<Label> listaLabels = new ArrayList<Label>();
listaLabels.addAll(Arrays.asList(labels));
【问题讨论】:
-
在我看来,您在两个列表上都调用了
clear(),这将清空两个列表。您的问题是“为什么两个列表都是空的”?要么我很困惑,要么你很困惑。 -
您正在清除 stateEntryList 和 stateExitList N 次(每个 transitionList 项目一次)。我不确定这是否是您想要的。
-
@Travis Webb:不,我使用 clear() 精确地清空了两个列表。
-
@Mohamed Nuur:我正在清除列表 N 次,以便它在内部循环中使用的列表为空。但是,我希望在 transitionList 中的最后一个元素之后,列表不会自己清空。