java - IndexOutOfBoundsException for for-loop in Kotlin -


i have 2 list in kotlin, of same size, foodobjects: mutablelist<parseobject>? , checked: mutablelist<boolean>?. need cycle , objectid foodobjects every time element of checked true. in java:

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

but in kotlin, don't know why, there problems. in fact, if this:

 for(i in  0..foodobjects!!.size)  {      if (checked?.get(i) == true) {         objectsid?.add(foodobjects.get(i).objectid)      }   } 

i've got indexoutofboundsexception : don't know why, continue cycle @ foodobjects.size. filter , map:

(0..foodobjects!!.size)                  .filter { checked?.get(it) == true }                  .foreach { objectsid?.add(foodobjects.get(it).objectid) } 

but i'm giving same error. need stop using if:

  for(i in  0..foodobjects!!.size)   {     if(i < foodobjects.size) {        if (checked?.get(i) == true) {                      objectsid?.add(foodobjects.get(i).objectid)        }     }   } 

to works.

everyone tell me why in kotlin need it, when in java works good?

ranges in kotlin inclusive, therefore 0..foodobjects!!.size starts @ 0 , ends @ foodobjects.size, including both ends. causes exception when loop attempts index list own size, 1 more largest valid index.

to create range doesn't include upper bound (like java loop), can use until:

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

you clean code bit if did null checks on collections you're using front:

if (foodobjects != null && checked != null && objectsid != null) {     (i in 0 until foodobjects.size) {         if (checked.get(i) == true) {             objectsid.add(foodobjects.get(i).objectid)         }     } } else {     // handle case when 1 of lists null } 

and rid of having handle indexes altogether, can use indices property of list (plus use indexing operator here instead of get calls):

for (i in foodobjects.indices) {     if (checked[i]) {         objectsid.add(foodobjects[i].objectid)     } } 

you use foreachindexed:

foodobjects.foreachindexed { i, foodobject ->     if (checked[i]) {         objectsid.add(foodobject.objectid)     } } 

Comments

Popular posts from this blog

node.js - Node js - Trying to send POST request, but it is not loading javascript content -

javascript - Replicate keyboard event with html button -

javascript - Web audio api 5.1 surround example not working in firefox -