根据 Int 数组过滤数组

Posted

技术标签:

【中文标题】根据 Int 数组过滤数组【英文标题】:Filtering an array based on an array of Int 【发布时间】:2022-01-01 11:10:48 【问题描述】:

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

现在在我的项目中,我在列表视图中显示所有 Drink 对象。在列表视图的顶部,有一个过滤部分供用户根据强度过滤Drink 对象。这些是复选框,这意味着用户可以选择最少 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 数组来过滤此数据的强度属性?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于根据 Int 数组过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

根据字符串数组过滤对象数组

根据嵌套数组值过滤数组

无法根据另一个对象数组过滤对象数组

如何根据另一个对象数组过滤一个对象数组?

根据月份和年份过滤对象数组

C#以int数组为索引过滤for循环的更快方法?