Индекс вне связанного исключения при создании Arraylist of Arraylist в Kotlin - PullRequest
0 голосов
/ 07 марта 2020

Что я пытаюсь сделать:

  • У меня есть список из 3 студентов
  • Я пытаюсь создать группу среди них (поэтому сначала в группе будет 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("")
    }

}

GroupingUtils.kt

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
        }
    }
}

StudentModel.kt

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)
        }
    }
}

Что происходит ::

В строке ниже есть 3 элемента

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

Работает до линии

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

Вылетает в строке ниже l oop во второй итерации

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

Журнал:

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
  • Как устранить ошибку

[Править]

У меня есть 2 элемента enter image description here

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Проблема возникнет здесь

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

Мы видим, mList - это список массивов, который содержит много других элементов. Каждый элемент тоже список. i,element -> означает, что i - это индекс элемента в mList.

Для решения этой проблемы вам необходимо добавить все элементы элемента в mStudLstPartn, переместив все элементы элемента.

0 голосов
/ 07 марта 2020

Я предполагаю, что именно здесь происходит ошибка:

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

Вы перебираете mList, но используете индекс из mList для доступа к элементу из element.

У вас есть mList как этот [[a, b], [c]], поэтому его элементы таковы:

с индексом 0: [a, b]

с индексом 1: [c]

Когда ваш forEachIndexed повторяется во второй раз, element имеет только один элемент (который равен c по индексу 0 ), но вы пытаетесь получить доступ к element[1], что, конечно, , выдает IndexOutOfBoundsException, потому что второго элемента нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...