Devrath:
私は何をしようとしています:
- 私は3人の生徒のリストを持っています
- (最初のグループは2人の学生を持つことになりますと、第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>>>()
これは、2回目の繰り返しのループの下のラインにクラッシュします
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)
質問:
- なぜバウンド例外のうち、インデックスがあります
- Javaのと類似のArrayListの配列リストを作成する方法
- エラーを解決する方法
[編集]
プリモジュ食堂:
私は、エラーが発生したところ、これがあると仮定します。
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
何の第二の要素が存在しないため。