过滤数组列表

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,如果您的前两个项目的 DRIVERJIM,它只会 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

filtertakeWhile return 一个 list,所以如果你想要一个 ArrayList。您必须像这样 ArrayList 将其转换为

ArrayList(tripsheetlist)