<lists>清空自己</lists>

时间:2011-05-17 00:37:58

标签: java list for-loop

晚上好,

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

基本上它的作用是检查Epsilon-Non Deterministic状态机在给定状态和可能的转换数组时将达到的下一个状态。 方法“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)之后打印了两个RIGHT,并且它们都是GONE。

我无法弄清楚他们为什么要自己清空。

有任何获得帮助的机会吗?

非常感谢先进。

编辑:这里是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));

3 个答案:

答案 0 :(得分:3)

如果在致电stateEntryList后致电stateExitList.clear()loadEpsilon为空,则表示List loadEpsilon返回与stateExitList有关联{1}}被传递给它。也许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();

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

答案 1 :(得分:1)

列表中没有自发地在Java中清空自己。相信我。它不会发生。

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

  • 也许这两个列表实际上是同一个对象,或者是同一个对象的视图。因此清除一个清单会清除第二个清单。

  • 在其他地方的第二个列表中可能会调用clear,而您还没有发现它。或者可能是因为删除/删除所有呼叫而发生的。

  • 也许第二个列表已经是空的。例如,您认为要添加到第二个列表的位置实际上是在添加一个完全不同的列表对象。

  • 也许您正在使用已破坏行为的自定义列表实现;例如其他一些操作实际上是将错误的副作用删除。

  • 也许是别的......

如果没有所有相关代码(包括跟踪代码代码)和跟踪图的输出,我们不会帮助您。

答案 2 :(得分:0)

loadEpsilon使用延迟执行吗?这可以解释为什么清空传递给它的列表会导致它返回的列表为空。