Android 在Kotlin中创建Arraylist的Arraylist时索引越界异常

Android 在Kotlin中创建Arraylist的Arraylist时索引越界异常,android,generics,kotlin,Android,Generics,Kotlin,我想做什么: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.get(ArrayList.java:437) at com.cnx.project.grouping.viewModels.FragDispGroupBlocksVM.initStudentGroups(FragDispGroupBlocksVM.kt:30) 我有一张三个学生的名单 我试图

我想做什么:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.cnx.project.grouping.viewModels.FragDispGroupBlocksVM.initStudentGroups(FragDispGroupBlocksVM.kt:30)
  • 我有一张三个学生的名单
  • 我试图在他们中间创建一个组(所以第一个组将有2个) 学生和第二组将有一名学生)

代码如下:

FragDispGroupBlocksVM.kt

class FragDispGroupBlocksVM @Inject constructor() : ViewModel() {

    private var mStudentList: MutableList<StudentModel> = ArrayList()


    constructor(studentList: MutableList<StudentModel>) : this(){
        mStudentList = studentList
        initStudentGroups()
    }

    fun initStudentGroups() {

        var mStudLstPartn : ArrayList<ArrayList<StudentModel>> = ArrayList()


        var partitionedList = GroupingUtils.partitionIntoSubGroups(mStudentList,2)

        val mList = partitionedList.filterIsInstance<ArrayList<ArrayList<StudentModel>>>()

        mList.forEachIndexed{i,element ->
            mStudLstPartn.add(element[i])
        }



        // mPartitionedList.postValue(mList);
        Timber.i("")
    }

}
class GroupingUtils {
    companion object {
        fun <T> partitionIntoSubGroups(
            members: Collection<T>,
            maxSize: Int
        ): MutableList<List<T>> {
            val res: MutableList<List<T>> = ArrayList()
            var internal: MutableList<T> = ArrayList()
            for (member in members) {
                internal.add(member)
                if (internal.size == maxSize) {
                    res.add(internal)
                    internal = ArrayList()
                }
            }
            if (internal.isNotEmpty()) {
                res.add(internal)
            }
            return res
        }
    }
}
data class StudentModel(
    @SerializedName("role")
    val role: String,
    @SerializedName("_id")
    val id: String,
    @SerializedName("firstName")
    val firstName: String,
    @SerializedName("lastName")
    val lastName: String,
    @SerializedName("kneuraId")
    val kneuraId: String,
    @SerializedName("email")
    val email: String,
    var isPresent: Boolean = true
): Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readByte() != 0.toByte()
    )

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest!!.writeString(role)
        dest.writeString(id)
        dest.writeString(firstName)
        dest.writeString(lastName)
        dest.writeString(kneuraId)
        dest.writeString(email)
        dest.writeByte(if (isPresent) 1 else 0)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<StudentModel> {
        override fun createFromParcel(parcel: Parcel): StudentModel {
            return StudentModel(parcel)
        }

        override fun newArray(size: Int): Array<StudentModel?> {
            return arrayOfNulls(size)
        }
    }
}
日志:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.cnx.project.grouping.viewModels.FragDispGroupBlocksVM.initStudentGroups(FragDispGroupBlocksVM.kt:30)
问题:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.cnx.project.grouping.viewModels.FragDispGroupBlocksVM.initStudentGroups(FragDispGroupBlocksVM.kt:30)
  • 为什么存在索引越界异常
  • 如何使Arraylist的数组列表类似于java
  • 如何解决错误

[编辑]

我有两个元素

我假设这就是错误发生的地方:

    mList.forEachIndexed { i, element ->
        mStudLstPartn.add(element[i])
    }
您正在迭代
mList
,但正在使用
mList
中的索引从
元素访问项

您有这样一个
mList
[[a,b],[c]]
,因此它的元素如下:

在索引0处:
[a,b]

在索引1处:
[c]


当您的
forachined
第二次迭代时,
元素
只有一项(索引0处的
c
),但您尝试访问
元素[1]
,当然,因为没有第二个元素,所以抛出
indexootfboundsexception

我假设这就是发生错误的地方:

    mList.forEachIndexed { i, element ->
        mStudLstPartn.add(element[i])
    }
您正在迭代
mList
,但正在使用
mList
中的索引从
元素访问项

您有这样一个
mList
[[a,b],[c]]
,因此它的元素如下:

在索引0处:
[a,b]

在索引1处:
[c]


当您的
forachined
第二次迭代时,
元素
只有一项(索引0处的
c
),但您尝试访问
元素[1]
,当然,因为没有第二个元素,所以抛出
IndexOutOfBoundsException

问题将在此处形成

 mList.forEachIndexed{i,element ->
     mStudLstPartn.add(element[i])
 }
我们可以看到
mList
是一个数组列表,它包含许多其他元素。每个元素也是一个列表
i,element->
表示i是mList中元素的索引


要解决此问题,您需要通过遍历元素的所有项将元素的所有项添加到mstudlspartn。

问题将在此处出现

 mList.forEachIndexed{i,element ->
     mStudLstPartn.add(element[i])
 }
我们可以看到
mList
是一个数组列表,它包含许多其他元素。每个元素也是一个列表
i,element->
表示i是mList中元素的索引


要解决此问题,您需要通过移动元素的所有项将元素的所有项添加到mstudlspartn。

安全呼叫

<List>.getOrNull()

exa:
val list = listOf(1, 2, 3)
println(list.getOrNull(0)) // 1
println(list.getOrNull(2)) // 3
println(list.getOrNull(3)) // null

val emptyList = emptyList<Int>()
println(emptyList.getOrNull(0)) // null
.getOrNull()
例:
val list=listOf(1、2、3)
println(list.getOrNull(0))//1
println(list.getOrNull(2))//3
println(list.getOrNull(3))//null
val emptyList=emptyList()
println(emptyList.getOrNull(0))//null

链接:您已经看到了安全呼叫

<List>.getOrNull()

exa:
val list = listOf(1, 2, 3)
println(list.getOrNull(0)) // 1
println(list.getOrNull(2)) // 3
println(list.getOrNull(3)) // null

val emptyList = emptyList<Int>()
println(emptyList.getOrNull(0)) // null
.getOrNull()
例:
val list=listOf(1、2、3)
println(list.getOrNull(0))//1
println(list.getOrNull(2))//3
println(list.getOrNull(3))//null
val emptyList=emptyList()
println(emptyList.getOrNull(0))//null

链接:您在索引1中看到了

我有元素。。。我贴了一张图片。请检查问题的编辑部分。如何解决这个问题,如果我以不同的方式循环正确,您有1个元素,它位于索引0处。在索引1处,您可以访问数组中不存在的第二个元素。我将更新答案,使其更具体、更清晰。好的,那么如何将
mList
的所有元素添加到
mStudLstPartn
mStudLstPartn=mList.flatte()
使用此选项将生成三个元素。。。。但是根据这个问题,我试图实现
Arraylist
Arraylist
。。。意思是
mstudlpartn
的第一个元素应该有一个由2个元素组成的
arrayist
,第二个项目必须有一个元素组成的
数组列表。…
在索引1:
我有这个元素。。。我贴了一张图片。请检查问题的编辑部分。如何解决这个问题,如果我以不同的方式循环正确,您有1个元素,它位于索引0处。在索引1处,您可以访问数组中不存在的第二个元素。我将更新答案,使其更具体、更清晰。好的,那么如何将
mList
的所有元素添加到
mStudLstPartn
mStudLstPartn=mList.flatte()
使用此选项将生成三个元素。。。。但是根据这个问题,我试图实现
Arraylist
Arraylist
。。。意思是
mstudlspartn
的第一个元素应该有一个由2个元素组成的
arrayist
,第二个元素必须有一个元素组成的
arrayilist
,您希望通过循环mList的部分实现什么?partitionedList中没有您需要的组吗?@MohamedMohsin。。。我正在尝试将
mList
的所有元素添加到
mstudlpartn
如果我可以问的话,
partitionedList
是否已经将学生分成两组?这不是必需的吗?您希望通过循环mList的部件实现什么?partitionedList中没有您需要的组吗?@MohamedMohsin。。。我正在尝试将
mList
的所有元素添加到
mstudlpartn
如果我可以问的话,
partitionedList
是否已经将学生分成两组?这不是必须的吗?