2

我被困住了。

以下函数应该返回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被传递给它。

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

4

1 回答 1

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。列表准备好后,获取其迭代器,并将其用于后续调用。

于 2013-09-01T02:31:23.283 回答