首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><Lists>正在清空自己

<Lists>正在清空自己
EN

Stack Overflow用户
提问于 2011-05-17 08:37:58
回答 3查看 89关注 0票数 0

晚上好,

我正尝试在Java上实现一个方法,我遇到了一个奇怪的问题。我将尽可能好地描述它:

基本上,它所做的是在给定状态和一系列可能的转换的情况下,检查Epsilon-非确定性状态机将达到的下一个状态。方法"loadEpsilon( list )“为给定的状态列表加载可能的epsilon转换。

代码语言:javascript
复制
      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”的方式填充整个代码,直到最后,就在

代码语言:javascript
复制
    stateExitList.clear();

一切都很好。然而,在这一行之后,我打印了紧跟在该句子后面的两个列表(StateExitList和StateEntryList),它们都消失了。

我就是搞不懂他们为什么要清空自己。

有机会得到帮助吗?

在进阶阶段非常感谢。

编辑:这是loadEpsilon的代码:

代码语言:javascript
复制
  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; 
  } 

列表的声明如下:

代码语言:javascript
复制
      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));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-17 08:57:39

如果在调用loadEpsilon之后调用stateExitList.clear()之后,stateEntryList为空,则指向loadEpsilon返回的List,该call以某种方式绑定到传递给它的stateExitList。也许loadEpsilon返回的列表正在使用传递给它的列表作为后备存储,或者类似的东西?您真的需要将代码发布到loadEpsilon

编辑:

好吧,这就解释了。您的loadEpsilon将返回传递给它的List。它返回的对象与给定的对象完全相同。所以你最终会得到同一个对象被两个名字引用的结果。但由于它是下面的同一对象,当你清除它时,它也会被清除。

你基本上是这样做的:

代码语言:javascript
复制
List<String> list1 = new ArrayList<String>();
list1.add("foo");
list1.add("bar");

List<String> sameList = list1;
sameList.add("quux");

list1.clear();

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-17 08:57:40

在Java中,列表不会自发地清空自身。请相信我。这不会发生的。

这意味着必须有不同的解释:

  • 也许这两个列表实际上是同一个对象,或者是同一个对象上的视图。所以清除一个列表也会清除第二个列表。
  • 可能正在其他地方调用第二个列表,但您还没有发现它。或者它可能是由于remove / removeAll调用而发生的。
  • 可能第二个列表已经为空。例如,当你认为你是在向第二个列表中添加内容时,实际上却是在向一个完全不同的列表对象中添加内容。
  • 也许你正在使用的自定义列表实现已经破坏了行为;例如,一些其他操作实际上是在将某些东西作为错误的side-effect.
  • Maybe删除它是另一种东西...

如果没有所有相关的代码(包括跟踪印记代码)和跟踪印记的输出,我们将无法帮助您完成这项工作。

票数 1
EN

Stack Overflow用户

发布于 2011-05-17 08:43:57

loadEpsilon是否在使用延迟执行?这就解释了为什么清空传递给它的列表会导致它返回的列表为空。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6025030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档