Ce que j'essaye de faire:
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:
[Éditer]
3 Réponses :
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.
.... 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
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.
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
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?