2016-08-24 90 views
0

我在URL中傳遞一些參數,然後將它們添加到列表中。我的列表有5個元素的限制。因此,如果有人在URL中添加第六個元素,則該列表將簡單地忽略它。所以我試圖使用一個計數器,但邏輯不按需要工作。我正在使用While循環來實現此目的。因此,如果列表大小小於5,則設置agencyCds,否則返回列表。在java中使用While循環計算列表的元素

private List<IUiIntegrationDto> generateViewIntegrationReportData(ESignatureIntegrationConfig eSignConfig) throws Exception { 
    int counter = 1; 
    if(eSignConfig.getAdditionalAgencyCds() != null) { 

     List<String> combinedAgencyCds = new ArrayList<String>(); 

     for(String agencyCd : eSignConfig.getAgencyCd()) { 
      combinedAgencyCds.add(agencyCd); 
     } 

     StringTokenizer token = new StringTokenizer(eSignConfig.getAdditionalAgencyCds().toString(), StringConstants.COMMA); 
     while(token.hasMoreTokens()) { 
      combinedAgencyCds.add(token.nextToken()); 
     } 

     while(combinedAgencyCds.size() < 5) { 
      counter = counter + 1; 
      eSignConfig.setAgencyCd(combinedAgencyCds); 
     } 

    // eSignConfig.setAgencyCd(combinedAgencyCds); 
    } 
    List<IUiIntegrationDto> intgList = getUiIntegrationManager().retrieveUiIntegrationReportData(eSignConfig.getAgencyCd(), eSignConfig.getCreatedDays(), 
      eSignConfig.getLob(), eSignConfig.getTransactionStatus(), eSignConfig.getAccounts(), eSignConfig.getSortKey(), eSignConfig.getSortOrder()); 

    return intgList; 
} 

我不完全確定這個邏輯,如果它是正確的或者如果有更好的方法。

謝謝

+0

你肯定當你調用eSignConfig.setAgencyCd(該combinedAgencyCds名單減少)?如果沒有,那麼你第二次while循環將是無限的。另外,什麼是計數器用於? – mdewit

+0

是啊,這是我在調試時發現的。我現在正在使用條件。如果(combinedAgencyCds.size()<5)\t \t \t counter = counter + 1; – Jaykumar

+0

if(combinedAgencyCds.size()<5) \t \t \t \t eSignConfig.setAgencyCd(combinedAgencyCds); \t \t \t} – Jaykumar

回答

2

試試這個,而不是在你的代碼的最後,而:如果是小於5的大小將被用於

if(combinedAgencyCds.size() <= 5) { 
    eSignConfig.setAgencyCd(combinedAgencyCds); 
} else { 
    eSignConfig.setAgencyCd(combinedAgencyCds.subList(0, 5)); 
} 

完整的組合列表。否則,只使用前5個元素。

編輯:甚至更好:

eSignConfig.setAgencyCd(combinedAgencyCds.subList(0, Math.min(5, combinedAgencyCds.size()))); 
+0

這就是我正在尋找mdewit。這太棒了。它正在按照要求工作。非常感謝你的幫助。這麼棒的學習。 – Jaykumar

+0

酷沒有問題,很高興它是有用的:) – mdewit

1

好的,讓我們來分析一下你的代碼當前正在做什麼。

int counter = 1; 

while(combinedAgencyCds.size() < 5) { 
    counter = counter + 1; 
    eSignConfig.setAgencyCd(combinedAgencyCds); 
} 

這段代碼有一些事情錯了最好的我可以告訴。首先,這個循環有可能永遠運行或根本不運行。因爲combinedAgencyCds從不被操縱,所以尺寸不會改變,在while循環中被檢查的邏輯從不做任何事情。其次,假設你不需要在while循環中使用計數器變量並且使用for循環,那麼會有更高效的循環。

實例語法如下:

for (int i = 0; i < combinedAgencyCds.size(); i++) { 
    if (i < 5) {   
     // Do your logic here. 
    } 
    else { 
     break; // Or handle extra values however you want. 
    } 
} 

聲明沒有必要爲一個計數器變量爲「我」計數爲您的明確聲明。

現在在你循環中的實際邏輯中,我不確定setAgencyCd方法的作用,但是如果它只是像eSignConfig那樣設置列表變量,反覆重複它不會做任何事情。根據我在代碼中看到的內容,您可以設置具有相同值5次的變量。如果您需要更多解釋,請告訴我,我會很樂意修改答案。

+0

這是有道理的,我沒有使用while循環,因爲它是無限的。我想要實現的是計算列表中的元素數量,這就是我使用計數器的原因。如果列表的大小是5或小於5,則使用set方法設置agencyCds,否則忽略第6個元素,但添加其他知識。 – Jaykumar