【问题标题】:Is there any way I can return a value from a loop and continue from where I left off?有什么办法可以从循环中返回一个值并从我离开的地方继续?
【发布时间】:2013-09-03 22:11:04
【问题描述】:

有什么方法可以从loop 返回一个值并从我离开的地方继续?

在下面的sn-p中,我想返回currVm的当前值。但我做不到。

在sn-p的最内层循环中:

while(c <= currVm) {
   allocatedVm(currVm);
   c++;
}

一个名为allocatedVm 的函数被调用。我想返回currVm 的值并从我离开的地方重新开始。有什么办法吗?

@Override
public int getNextAvailableVm() {
    Set<String> dataCenters = confMap.keySet();
    for (String dataCenter : dataCenters) {
        LinkedList<DepConfAttr> list = confMap.get(dataCenter);
        Collections.sort(list, new MemoryComparator());
        int size = list.size() - 1;
        int count = 0;
        while(size >= 0) {
            DepConfAttr dca = (DepConfAttr)list.get(count);
            int currVm = dca.getVmCount();
            int c = 0;
            while(c <= currVm) {
                allocatedVm(currVm); // RETURN currVm
                c++;
            }
            count++;
            size--;
        }
    }        
}

【问题讨论】:

  • 很难猜出您在说什么,因为您没有向我们展示allocatedVm 方法。你从哪里返回这个值,你想恢复哪一部分?
  • @RohitJain 为什么要allocatedVm 方法?
  • @RohitJain,OP 期待 LazySeq(Java 8)、Stream(scala) 之类的东西
  • @RohitJain 我想在调用allocatedVM后立即返回值

标签: java loops return


【解决方案1】:

您可以从方法中的任何位置返回,只需输入 return 关键字。如果您想添加一个功能来从不同的地方恢复您的方法,那么您需要以这种方式考虑您的方法。你可以使用labelsif语句,设置一些静态变量来标记最后执行的地方。如果您的应用程序不是多线程的,那么您不必担心使用静态变量同步。此外,如果您的方法太大并且难以理解/阅读,请考虑将其拆分为更小的方法。

【讨论】:

  • 你能帮我处理这段代码吗?我想一打电话给allocatedVm(...)就回currVm
  • @saplingPro 在allocatedVm(...) 之后放了一个return 语句。
【解决方案2】:

最好的方法可能是编写一个返回Iterable&lt;Integer&gt; 的方法。这在 Java 中并不像在支持生成器函数的语言(例如 C# 和 Python)中那么容易,但它仍然是可行的。如果代码很短,你可以使用一对(嵌套的)匿名内部类:

public Iterable<Integer> foo() {
    return new Iterable<Integer>() {
        @Override public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                // Implement hasNext, next and remove here
            };
        }
    };
}

在你的情况下,我很想把它分成一个单独的非匿名类,只是为了简单起见。

无论如何,使用Iterable 的意义在于Iterator 自然 有状态——基本上,这就是它的目的。所以它非常适合您的要求。

另一种更简单的方法是一次性返回所有元素,并让调用者按需执行分配。显然,如果可能有大量元素,这将无法正常工作,但它会更容易理解。

【讨论】:

  • 我没听懂。我在return new Iterator&lt;?&gt; {..}中实现了什么@
  • @saplingPro:你需要实现Iterator接口——hasNextnextremove方法。 (您可能只想从remove 抛出一个异常。)您可能需要将所有局部变量转换为迭代器中的实例变量。它不会是令人愉快的代码,但这只是必须在调用之间保留状态的本质。
  • @saplingPro:请参阅我编辑的答案以获得另一种选择(在底部) - 我们需要更多上下文来了解这是否合适。
  • @saplingPro:不,恐怕不会。我们真的没有足够的上下文来了解最合适的操作过程(迭代器或返回整个集合),而且我现在没有时间简单地将您的代码转换为迭代器。您应该自己尝试一下(先研究IterableIterator 接口),然后如果您有问题,请用您的代码提出具体 问题。
【解决方案3】:

不确定我是否了解您的需求,但是:

如果您希望在方法运行期间通知方法的调用者您已获得一个值,但又不想立即退出该方法,您可以使用侦听器。

只需创建一个接口作为函数的参数,并在其中包含一个函数,该函数将对象作为参数。

示例:

interface IGotValueListener 
  {
  public void onGotValue(MyClass obj); 
  }

public int getNextAvailableVm(IGotValueListener listener)
  {
  ...
  if(listener!=null)
    listener.onGotValue(...);
  }

现在,为了调用该方法,你可以这样做:

int finalResult=getNextAvailableVm(new IGotValueListener ()
  {
  ... //implement onGotValue
  };

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多