我被困住了。
以下函数应该返回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
的参数将传递给它。
这是我需要返回的变量。我该怎么做才能返回这个变量?我必须从我离开开始。我的意思是,在执行循环时,下一个调用似乎应该是下一步,无论它是什么。
答案 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
。列表准备好后,抓住它的迭代器,并将其用于后续调用。