我有一个类,我想使用它,根据驱动程序过滤我的数组。驱动程序是硬编码的,只是为了消除代码不能工作的可能性。我尝试过许多不同的方法,但似乎没有一种方法奏效。我得到错误的IndexOutOfBoundsException: Index: 1, Size: 0后,我的行println(driverList[3].DELNO)。
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): List<DataModel> {
println("driver in datafilter subclass")
println(driver)
println("tripsheetlist[3].DELNO")
println(tripsheetlist[3].DELNO)
var driverList: List<DataModel> = tripsheetlist
// var driverList : ArrayList<DataModel> = tripsheetlist.filter { s -> s == driver }
var i = 0
while ( i != tripsheetlist.size){
driverList = tripsheetlist.takeWhile { tripsheetlist[i].DRIVER == "JIM" }
i++
}
println("driverList[3].DELNO")
println(driverList[3].DELNO)
return driverList
}下面是DataModel
class DataModel(
var TRIPSHEETNO: Int,
var WONUMBER: String,
var DELNO: Int,
var CUSTOMER: String,
var DRIVER: String,
var WEIGHT: Double,
var state: DataState = DataState.Unselected
)在过滤器之后,我看到它作为一个List而不是ArrayList返回。我已确定这不影响我的数据。
谢谢你的建议。
解决办法:
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): ArrayList<DataModel> {
return ArrayList(tripsheetlist.filter { it.DRIVER == driver }) }发布于 2022-05-13 10:23:48
IndexOutOfBoundsException: Index: 1 Size: 0可能来自println(driverList[3].DELNO)行,当您试图访问在list中不可用的index时,在list上使用了takeWhile。
这里
tripsheetlist.takeWhile { tripsheetlist[i].DRIVER == "JIM" }在takeWhile中,您比较了只有第一项的DRIVER,因此当第一项的DRIVER不是JIM时,它将返回emptyList,或者当第一项的DRIVER值为JIM时返回完整列表。
您不应该在用例中使用takeWhile,因为它只会在列表的开头返回与给定条件匹配的项。因此,如果您的第一个项的DRIVER不是JIM,它将返回一个emptyList,如果您的前两个项的DRIVER是JIM,它将只返回这两个项,并且不会检查其余的项。
您应该使用filter,您的方法可以像这样进行重构
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): List<DataModel> {
return tripsheetlist.filter { it.DRIVER == driver }
},在过滤器之后,我看到它作为列表返回,而不是ArrayList
filter和takeWhile返回一个list,所以如果您想要一个ArrayList。你必须像这样把它演成ArrayList
ArrayList(tripsheetlist)https://stackoverflow.com/questions/72227417
复制相似问题