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
是否已经将学生分成两组?这不是必须的吗?