晚上好,
我正尝试在Java上实现一个方法,我遇到了一个奇怪的问题。我将尽可能好地描述它:
基本上,它所做的是在给定状态和一系列可能的转换的情况下,检查Epsilon-非确定性状态机将达到的下一个状态。方法"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));发布于 2011-05-17 08:57:39
如果在调用loadEpsilon之后调用stateExitList.clear()之后,stateEntryList为空,则指向loadEpsilon返回的List,该call以某种方式绑定到传递给它的stateExitList。也许loadEpsilon返回的列表正在使用传递给它的列表作为后备存储,或者类似的东西?您真的需要将代码发布到loadEpsilon。
编辑:
好吧,这就解释了。您的loadEpsilon将返回传递给它的List。它返回的对象与给定的对象完全相同。所以你最终会得到同一个对象被两个名字引用的结果。但由于它是下面的同一对象,当你清除它时,它也会被清除。
你基本上是这样做的:
List<String> list1 = new ArrayList<String>();
list1.add("foo");
list1.add("bar");
List<String> sameList = list1;
sameList.add("quux");
list1.clear();这是否让我们更清楚为什么清除一个列表就会清除它们“两个”呢?(同样,只有一个对象被两个引用变量引用)。
发布于 2011-05-17 08:57:40
在Java中,列表不会自发地清空自身。请相信我。这不会发生的。
这意味着必须有不同的解释:
如果没有所有相关的代码(包括跟踪印记代码)和跟踪印记的输出,我们将无法帮助您完成这项工作。
发布于 2011-05-17 08:43:57
loadEpsilon是否在使用延迟执行?这就解释了为什么清空传递给它的列表会导致它返回的列表为空。
https://stackoverflow.com/questions/6025030
复制相似问题