2017-07-26 41 views
0

我有兩個列表Kotlin,相同大小foodObjects: MutableList<ParseObject>?checked: MutableList<Boolean>?。每當checked的元素成立時,我需要做一個for循環,並從foodObjects中獲取objectId。所以這是在Java中:IndexOutOfBoundsException for循環在Kotlin

for(int i = 0; i< foodObjects.size(); i++) { 
     //here 
    } 

但在Kotlin,我不知道爲什麼,有一些問題。事實上,如果我這樣做:

for(i in 0..foodObjects!!.size) 
{ 
    if (checked?.get(i) == true) { 
     objectsId?.add(foodObjects.get(i).objectId) 
    } 

} 

我已經得到了IndexOutOfBoundsException:我不知道爲什麼,就繼續循環也在foodObjects.size。我也可以用過濾器和地圖來做:

(0..foodObjects!!.size) 
       .filter { checked?.get(it) == true } 
       .forEach { objectsId?.add(foodObjects.get(it).objectId) } 

但是我給出了同樣的錯誤。我需要停止它使用這個如果:

for(i in 0..foodObjects!!.size) 
    { 
    if(i < foodObjects.size) { 
     if (checked?.get(i) == true) { 
        objectsId?.add(foodObjects.get(i).objectId) 
     } 
    } 
    } 

讓它工作。

每個人都可以告訴我爲什麼在Kotlin我需要這樣做,在Java中它工作的很好?

回答

9

Kotlin的範圍是包含的,因此0..foodObjects!!.size開始於0並結束於foodObjects.size,包括兩端。當您的循環嘗試使用自己的大小索引列表時,這會導致異常,這比最大的有效索引多一個索引。

要創建不包括上限(如您的Java循環)的範圍內,可以使用until

for(i in 0 until foodObjects!!.size) { 
    // ... 
} 

您還可以清理你的代碼了一下,如果你做了你正在使用前面的集合null檢查:

if (foodObjects != null && checked != null && objectsId != null) { 
    for (i in 0 until foodObjects.size) { 
     if (checked.get(i) == true) { 
      objectsId.add(foodObjects.get(i).objectId) 
     } 
    } 
} 
else { 
    // handle the case when one of the lists is null 
} 

並擺脫不必完全處理指標,可以用列表的indices財產(加上我用的是索引操作符這裏,而不是get電話):

for (i in foodObjects.indices) { 
    if (checked[i]) { 
     objectsId.add(foodObjects[i].objectId) 
    } 
} 

您還可以使用forEachIndexed

foodObjects.forEachIndexed { i, foodObject -> 
    if (checked[i]) { 
     objectsId.add(foodObject.objectId) 
    } 
} 
+0

謝謝,我以爲它和Java很相似,現在我明白了! – ste9206

+0

對不起我的問題,但如何在recyclerview中使用此結構?我發現了同樣的問題 – ste9206

+0

我不確定你的問題是關於RecyclerView的,但你應該將它作爲一個新問題發佈。 – zsmb13

1

看看從科特林文檔這個例子ranges

if (i in 1..10) { // equivalent of 1 <= i && i <= 10 
    println(i) 
} 

由於你可以看到

1,2,3,4,5,6,7,8,9,10

將被打印。所以,包括10。

您收集的foodObjects的最高索引是(foodObjects.size() - 1),因爲它以0開頭。

因此,要解決您的問題,只是這樣做:

for(i in 0..(foodObjects.size - 1)) { 
    // ... 
} 

一種更好的方式來寫,這將是:

for((i, element) in foodObjects.withIndex()){ 
    // do something with element 
    println("The index is $i") 
} 

這種方式,你有元素和索引一次,不需要擔心範圍。

*爲了簡單起見,我刪除了空檢查。