根据 Int 数组过滤数组

Filtering an array based on an array of Int

我有一个 Drink 对象,它有一个名为 strength 的 属性。强度是一个整数,值为 0、1、2 或 3。

现在在我的项目中,我在列表视图中显示所有 Drink 对象。在列表视图的顶部,有一个过滤部分,供用户根据强度过滤 Drink 个对象。这些是复选框,这意味着用户可以 select 少至 1 个过滤器,或多至 4 个。这将作为 Int 数组保存到 SharedPreferences。

data class Drink(val theDrinkName:String, val strength:Int)


object DrinkData {

    const val low = 0
    const val medium = 1
    const val strong = 2
    const val intense = 3

    fun generateAllDrinks():Array<Drink> {
        return arrayOf(
            Drink("Vodka", medium),
            Drink("Shirley Temple", low),
            Drink("rum", strong),
            Drink("Gin", medium),
            Drink("151", intense),
            Drink("99", strong)
        )
    }

}

以下是我生成所有数据的方式:

val allDrinks = DrinkData.generateAllDrinks().sortedWith(
    compareBy<Drink> { it.theDrinkName.first().isDigit() }
        .thenBy { it.theDrinkName.toLowerCase() }
)

我需要能够根据 Int 数组过滤此数据的强度 属性。(Int 数组是保存到 SharedPreferences 的内容。)

val filteredStrengthArray = arrayListOf<Int>(2,3)

这会过滤 allDrinks 朗姆酒、151、99。

我的进度:

这是我实现此过滤的壁橱。

    val allDrinks = DrinkData.generateAllDrinks().sortedWith(
        compareBy<Drink> { it.theDrinkName.first().isDigit() }
            .thenBy { it.theDrinkName.toLowerCase() }
    ).filter { it.strength == 2 || it.strength == 3 }

问题是我需要按 Int 数组进行过滤以对齐保存在 SharedPreferences 中的内容。

如何通过提供 Int 数组来过滤此数据的强度 属性?

想到的第一个解决方案是检查 strength 属性 是否包含在 filteredStrengthArray 中:

val filteredStrengthArray = arrayListOf<Int>(2,3)
val allDrinks = DrinkData.generateAllDrinks().sortedWith(
        ...
    ).filter { filteredStrengthArray.isEmpty() || filteredStrengthArray.contains(it.strength) }