过滤数组列表
Filtering array list
我有一个 class,我想使用它来根据驱动程序过滤我的数组。对驱动程序进行硬编码只是为了尝试消除代码无法正常工作的可能性。我尝试了很多不同的方法 none 似乎都有效。我在 println(driverList[3].DELNO)
.
行后收到错误 IndexOutOfBoundsException: Index: 1, Size: 0
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
)
过滤后我发现它 returns 是 List
而不是 ArrayList
。我确定这不会影响我的数据。
感谢您的所有建议。
解决方案:
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): ArrayList<DataModel> {
return ArrayList(tripsheetlist.filter { it.DRIVER == driver }) }
IndexOutOfBoundsException: Index: 1 Size: 0
可能来自 println(driverList[3].DELNO)
行,在您尝试访问 index
时在 list
上使用 takeWhile
之后在 list
.
中不可用
这里
tripsheetlist.takeWhile { tripsheetlist[i].DRIVER == "JIM" }
在 takeWhile
中,您只比较了第一项的 DRIVER
,因此当第一项的 DRIVER
时,它会 return emptyList
当第一项的 DRIVER
值为 JIM
.
时,将不会是 JIM
或完整列表
您不应将 takeWhile
用于您的用例,因为它只会 return 列表开头符合您给定条件的项目。因此,如果您的第一个项目的 DRIVER
不是 JIM
,它会 return 一个 emptyList
,如果您的前两个项目的 DRIVER
是 JIM
,它只会 return 这两个,不会检查剩余的项目。
你应该使用 filter
并且你的方法可以像这样重构
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): List<DataModel> {
return tripsheetlist.filter { it.DRIVER == driver }
}
After the filter I have seen it returns as an List and not ArrayList
filter
和 takeWhile
return 一个 list
,所以如果你想要一个 ArrayList
。您必须像这样 ArrayList
将其转换为
ArrayList(tripsheetlist)
我有一个 class,我想使用它来根据驱动程序过滤我的数组。对驱动程序进行硬编码只是为了尝试消除代码无法正常工作的可能性。我尝试了很多不同的方法 none 似乎都有效。我在 println(driverList[3].DELNO)
.
IndexOutOfBoundsException: Index: 1, Size: 0
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
)
过滤后我发现它 returns 是 List
而不是 ArrayList
。我确定这不会影响我的数据。
感谢您的所有建议。
解决方案:
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): ArrayList<DataModel> {
return ArrayList(tripsheetlist.filter { it.DRIVER == driver }) }
IndexOutOfBoundsException: Index: 1 Size: 0
可能来自 println(driverList[3].DELNO)
行,在您尝试访问 index
时在 list
上使用 takeWhile
之后在 list
.
这里
tripsheetlist.takeWhile { tripsheetlist[i].DRIVER == "JIM" }
在 takeWhile
中,您只比较了第一项的 DRIVER
,因此当第一项的 DRIVER
时,它会 return emptyList
当第一项的 DRIVER
值为 JIM
.
JIM
或完整列表
您不应将 takeWhile
用于您的用例,因为它只会 return 列表开头符合您给定条件的项目。因此,如果您的第一个项目的 DRIVER
不是 JIM
,它会 return 一个 emptyList
,如果您的前两个项目的 DRIVER
是 JIM
,它只会 return 这两个,不会检查剩余的项目。
你应该使用 filter
并且你的方法可以像这样重构
private fun datafilter(tripsheetlist: ArrayList<DataModel>, driver: String): List<DataModel> {
return tripsheetlist.filter { it.DRIVER == driver }
}
After the filter I have seen it returns as an List and not ArrayList
filter
和 takeWhile
return 一个 list
,所以如果你想要一个 ArrayList
。您必须像这样 ArrayList
将其转换为
ArrayList(tripsheetlist)