我必须从多次调用的函数返回一个值,我无法做到这一点

时间:2013-09-01 02:11:29

标签: java function loops return

我被困住了。

以下函数应该返回currVm,一个整数。但是,如果我创建return,我将打破循环,下次调用此函数时,将再次开始相同的过程。

我该怎么办,以便从我离开的地方继续?我尝试制作static变量,但我没有帮助我。

@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);
                c++;
                return currVm;
            }
            count++;
            size--;
        }
    }

    return 0;
}  

for-each循环指定一个新的data center作为confMap的一个键。我得到的值作为一个值排序。然后循环运行直到它转义它的大小。在while loop之内,运行另一个while loop,从中调用继承类的allocatedVm函数。名为currVm的参数将传递给它。

这是我需要返回的变量。我该怎么做才能返回这个变量?我必须从我离开开始。我的意思是,在执行循环时,下一个调用似乎应该是下一步,无论它是什么。

1 个答案:

答案 0 :(得分:1)

List<Integer>对象添加到您的班级,并按如下方式更改您的方法:

private Iterator<Integer> availableVms = null;
@Override
public int getNextAvailableVm() {
    if (availableVms != null) {
        if (availableVms.hasNext()) {
            return availableVms.next();
        }
        return 0;
    }
    List<Integer> tmp = new ArrayList<Integer>();
    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);
                c++;
                tmp.add(currVm);
            }
            count++;
            size--;
        }
    }
    availableVms = tmp.iterator();
    return availableVms.hasNext() ? availableVms.next() : 0;
}

这个想法是预先生成整个列表,并存储其迭代器以供将来使用。在输入方法之前,检查是否已准备好availableVms迭代器。如果已准备好,如果可用,请抓住下一个项目;否则,返回零。

如果尚未准备好列表,请运行算法,并将结果添加到临时列表tmp。列表准备好后,抓住它的迭代器,并将其用于后续调用。