2013-09-01 24 views
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 .The名單,我得到一個價值的關鍵,是sorted.Then循環運行,直到它逃脫了size.Inside這個while loop,另一個while loop從調用繼承類的函數allocatedVm的位置運行。將名爲currVm的參數傳遞給它。

這是我需要返回的變量。我該怎麼做才能返回這個變量?我必須從我離開開始。我的意思是下一次調用應該是執行循環時的下一個步驟,不管它是什麼。

+0

你想要的是'yield'。不幸的是,Java沒有「yield」。你必須切換到C#。 :-P –

+0

@ ChrisJester-Young在Java中肯定會有出路 – saplingPro

+0

我確定有,但它會很醜陋。 :-('yield'是一個非常乾淨和容易閱讀的特性,我真的希望Java有'yield'的特性。另請參見:http://stackoverflow.com/q/1980953/13 –

回答

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。清單準備就緒後,抓住它的迭代器,並將其用於後續調用。

+0

所以整個算法將只執行一次..?和下次調用該函數時,'if(availableVms.hasNext())'將始終執行......這就是說,迭代器自然保留其狀態 – saplingPro

+0

@saplingPro是的,下一次函數執行時,'availableVms'不會是'null',所以會輸入頂部的'if'。如果你想在vms列表耗盡後重用對象,你需要提供一個'reset'方法設置'availableVms = null'。在返回零來重置迭代之前,您也可以重置'availableVms = null'。 – dasblinkenlight

相關問題