gpt4 book ai didi

java - 清空自身

转载 作者:行者123 更新时间:2023-12-01 19:17:23 27 4
gpt4 key购买 nike

晚上好,

我尝试在 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));

最佳答案

如果stateEntryList调用 stateExitList.clear() 后为空调用loadEpsilon后,指向 ListloadEpsilon返回以某种方式与 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();

这是否更清楚为什么清除一个列表会清除“两个”列表? (同样,那里只有一个对象被两个引用变量引用)。

关于java - <Lists> 清空自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6025030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com