簡體   English   中英

使用增強的for循環時的IndexOutOfBoundsException

[英]IndexOutOfBoundsException when using an enhanced for-loop

當我嘗試運行以下代碼時,我的增強型for循環返回IndexOutOfBoundsException:

public static ArrayList<Double> multipliser(ArrayList<Double> listen, int multi) {

    for(double elementer : listen) {
        listen.set((int) elementer, listen.get((int) elementer * multi)); 
    }
    return listen;

它可以與舊的for循環完美配合:

for(int i = 0; i < listen.size(); i++) {
    listen.set(i, listen.get(i) * multi);
}
return listen;

我想念什么?

listen.get((int) elementer * multi)

與...不同

listen.get(i)*multi

同樣在set

但是,將列表中的所有內容乘以一個常數就位的簡單方法(在Java 8+中)是:

listen.replaceAll(x -> x * multi);

Java 8之前的最簡單方法是使用ListIterator

for (ListIterator<Double> it = listen.listIterator(); it.hasNext();) {
  it.set(it.next() * multi);
}

(請注意,這大致是Collection.replaceAll的默認實現在Java 8+中的外觀)。

在“增強”循環中,將元素設置為與元素值相對應的索引,而不是當前循環迭代的索引。

一般來說,我不鼓勵您編輯要循環播放的列表或作為參數傳遞的對象。 您應該創建一個新列表以返回:

List<Double> result = new ArrayList<>();
for (double elementer : listen) {
    result.add(elementer * multi);
}
return result;

還要在方法簽名中使用接口( List ),而不要在實現中使用接口( ArrayList ):

public static List<Double> multipliser(List<Double> listen, int multi) {

您甚至可以嘗試使用較小的方法,所以2017+(Java 8+):

return listen.stream().map(x -> x * multi).collect(Collectors.toList());

甚至按Andy Turner的建議replaceAll()

非常感謝大家! 我現在了解我是如何錯誤地使用元素而不是索引。 有效的代碼(遠非最佳)如下所示:

public static ArrayList<Double> multipliser(ArrayList<Double> listen, int multi){
    int i = 0; 
    for(double elementer : listen) {
        listen.set(i, elementer*multi);
        i++;
    }
    return listen;

謝謝大家,度過一個愉快的周末!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM