2017-07-16 82 views
-1

我正在嘗試創建一個循環,它只能遍歷列表的一部分,但列表有時只有一個或兩個項目放入它。無論循環中有多少物品,我的目標是打印不超過3個結果。越界異常

if (event.getMessage().getContent().startsWith("!!")) { 
       for (int i=0; i<allMatches.size(); i++) { 
        event.getTextChannel().sendMessage((i+1)+".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
          .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
       } 
      } 
      else { 
       for (int i=0; i<3; i++) { 
        event.getTextChannel().sendMessage((i+1)+".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
          .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
       } 
      } 

據我所知,出界失誤從我< 3來當列表只中有1個或2項,但循環不斷去反正。我嘗試了各種各樣的東西,但我不太清楚如何正確地做到這一點。

謝謝。

+3

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助你一些補充性的調試技術。如果您之後仍然遇到問題,請隨時返回一個顯示您的問題的[最小化,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

回答

1

如果我正確理解你,你只是想打印3和尺寸的較小的次數?你可以計算出之前,你的循環,即號碼,這樣你只需要一個for循環,而不是:(?假設2號上的是你需要幫助的)

if (event.getMessage().getContent().startsWith("!!")) { 
for (int i = 0; i < allMatches.size(); i++) { 
    event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
    .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
} 

} else { 
for (int i = 0; i < Math.min(3, allMatches.size()); i++) { 
    event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
    .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
} 
} 

我改變了對循環聲明:

for (int i = 0; i < Math.min(3, allMatches.size()); i++)

所以現在它會運行3或allMatches.size()次數,以較小者爲準。


另一種優化,以減少重複的代碼量是計算的時間循環次數,您之外循環,並只有1個循環:

int loops = Math.min(3, allMatches.size()); 
if (event.getMessage().getContent().startsWith("!!")) 
    loops = allMatches.size(); 

for (int i = 0; i < loops; i++) { 
    event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
    .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
} 

它始終是一個好主意爲了減少重複代碼的可讀性和調試性,並且由於它們看起來都是循環執行相同的事情,所以最好像上面所做的那樣重構代碼以避免重複的代碼。

+0

謝謝。我對編程還很陌生,但我知道必須有一種優化方法。 – PierceJ

+0

沒問題,希望我說的是有道理的 – Chris

-1

在第二個循環中添加一個if子句。

if(allMatches.size()==i)break; 
2

您可以使用流API來解決這個問題:

AtomicInteger num = new AtomicInteger(1);// use this for string number 
allMatches.stream().limit(3).forEach(value -> event.getTextChannel() 
    .sendMessage(num.getAndIncrement()+".\\)"+value.replace("\"", "") 
    .replace(",", "; ").replace("[", " ") 
    .replace("]", "").replace("english_definitions:", "")).queue() 
); 

有了限制方法,你可以遍歷thrue只需要值的數量,如果列表的大小不,你不會得到任何問題。

+2

還請添加一些解釋,而不僅僅是一堆代碼行。按照目前的形式,這對OP來說並不是非常有幫助,因爲它可以理解這個問題,爲什麼這是一個解決方案。 – Zabuza