0
votes

Index hors de l'exception liée lors de la création de Arraylist de Arraylist dans Kotlin

Ce que j'essaye de faire:

  • J'ai une liste de 3 étudiants
  • J'essaye de créer un groupe parmi eux (donc le premier groupe aura 2 étudiants et le second groupe aura un étudiant)

Voici le code:

FragDispGroupBlocksVM.kt

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)

GroupingUtils.kt

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

StudentModel.kt

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

Qu'est-ce qui se passe ::

La ligne ci-dessous comporte 3 éléments

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

Il fonctionne jusqu'à la ligne

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

Il plante en ligne sous la boucle dans la deuxième itération

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

Journal:

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

}

Des questions:

  • Pourquoi il existe un index hors de l'exception liée
  • Comment créer une liste Array de Arraylist similaire à Java
  • Comment résoudre l'erreur

[Éditer]

J'ai 2 éléments entrez la description de l'image ici


3 commentaires

que cherchez-vous à réaliser avec la partie qui boucle mList? partitionedList n'a-t-il pas déjà les groupes dont vous avez besoin?


@MohamedMohsin ... Je suis en train d'ajouter tous les éléments de mList à mStudLstPartn


si je peux demander, partitionedList n'a-t-il pas déjà les étudiants en groupes de deux? n'est-ce pas ce qui est requis?


3 Réponses :


0
votes

Je suppose que c'est là que l'erreur se produit:

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

Vous effectuez une itération dans mList , mais utilisez l'index de mList pour accéder à l'élément à partir de l' element .

Vous avez un mList comme celui-ci [[a, b], [c]] , donc ses éléments sont les suivants:

à l'index 0: [a, b]

à l'indice 1: [c]

Lorsque votre forEachIndexed itère pour la deuxième fois, l' element n'a qu'un seul élément (qui est c à l'index 0 ), mais vous essayez d'accéder à l' element[1] , qui, bien sûr, lève IndexOutOfBoundsException car il n'y a pas de deuxième élément.


7 commentaires

.... at index 1: j'ai l'élément ... J'ai posté une image. veuillez vérifier la partie d'édition de la question. Comment résoudre ce problème, devrais-je boucler d'une manière différente


Correct, vous avez 1 élément, qui se trouve à l'index 0. À l'index 1, vous accédez au deuxième élément du tableau, qui n'existe pas. Je mettrai à jour la réponse pour la rendre plus précise et donc plus claire.


Ok, alors comment ajouter tous les éléments de mList à mStudLstPartn


mStudLstPartn = mList.flatten()


En utilisant cela, vous Arraylist trois éléments ... mais selon la question, j'essaie d'obtenir une Array list de Arraylist de Arraylist ... ce qui signifie que le premier élément de mStudLstPartn doit avoir un arrayist de 2 éléments et le deuxième élément doit avoir une array list de array list de 1 élément


À première vue, cela fonctionne déjà. Dans mList vous avez ce que vous souhaitez stocker dans mStudLstPartn . Si tel est le cas, faites simplement var mStudLstPartn = GroupingUtils.partitionIntoSubGroups(mStudentList,2) et assurez-vous d'avoir les bons types partout.


Cela a résolu l'erreur merci, ... si mal marquer ceci comme accepté ... J'ai quelques questions ... Je vais formuler une nouvelle question



0
votes

Le problème viendra ici

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

Nous pouvons voir que mList est une liste de tableaux et qu'elle contient de nombreux autres éléments. Chaque élément est également une liste. i,element -> signifie que i est l'indice de l'élément dans mList.

Pour résoudre ce problème, vous devez ajouter tous les éléments de l'élément à mStudLstPartn en parcourant tous les éléments de l'élément.


0 commentaires

0
votes

appel sûr

<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

lien: vous avez voir https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/get-or-null.html


0 commentaires