【问题标题】:How to loop over Map<String, Array<Any>> in Kotlin?如何在 Kotlin 中循环 Map<String, Array<Any>>?
【发布时间】:2020-04-15 10:47:02
【问题描述】:

在我的带有 Kotlin 的 android 应用程序中,我有一个变量“数据”类型的 Map>,哪个产品是一个 kotlin 数据类。

var data: Map<String, Array<Product>>

产品数据类包含 var availableQuantities。 我想循环 Map> 并仅保留可用数量!= 0 的产品,并更新数据变量。我该怎么做? 这是我的代码

   try {
        val filteredMap: HashMap<String, Array<Product>> = HashMap()
        data.forEach { (key, value) ->
            val filtered = value.filter { prod -> prod.availableQuantities != 0 }
            if (filtered.isNotEmpty()) {
                filteredMap[key] = filtered.toTypedArray()
            }
        }
    } catch (e: Throwable) {
        e.message
    }

但是,运行代码后出现异常,如下图:

下图为数据说明:

如何更正我的代码以使其正常运行?

【问题讨论】:

  • 您需要结果作为地图还是只是产品列表?
  • 我需要一个结果作为地图,我想更新“数据”
  • 当您在下面的各种 cmet 中说您的“应用程序被阻止”时,您的意思是它崩溃还是挂起?
  • 我将 try catch 添加到我的代码中,我得到以下异常 java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.models.Product[]

标签: android kotlin hashmap


【解决方案1】:

我认为它可以使用.values.flatten() 来制作一个平面列表。

  val tempProd = data.values.flatten().filter {
            it.availableQuantities != 0
        }

【讨论】:

    【解决方案2】:

    这样的东西不可行吗?

    val tempProd = StreamSupport.stream(data.values.toMutableList())
                .map{t -> t.filter{
                    it.availableQuantities!= 0
                } }
    

    您可能会得到空数组,因为它是一个数组数组。如果你只想要一个数组,你需要减少二维数组

    【讨论】:

    • 不,没用我想循环数据,并只用数量不为零的产品更新它你明白了吗?
    【解决方案3】:

    除了使用 Stream,您还可以简单地受益于 kotlin 扩展函数并使用 flatMap {} 删除空数组,以便将 Product 的所有数组合并到单个列表中。

    所以你的场景看起来像:

    val temp = data.values.flatMap { products ->
        products.filter { product ->
            product.quantity != 0
        }
    }
    

    【讨论】:

    • 当我使用你的答案时,应用程序被阻止
    • 消息是什么?
    • 没有消息,只有我调试也被屏蔽了
    【解决方案4】:
    data = data.mapValues { (_, array) ->
        array.filter { it.availableQuantities != 0 }.toTypedArray()
    }
    

    【讨论】:

    • 我喜欢你的回答,但应用程序被阻止我不知道为什么
    • 是动态地图,不是静态地图
    • @Lina 在您使用此代码并且应用程序被阻止时。无论如何,然后在不同的线程中使用它
    • 是的,当我调试应用程序时,只出现“应用程序正在运行”的消息
    • 我将 try catch 添加到我的代码中,我得到以下异常 java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.models.Product[]
    【解决方案5】:

    我可以想到两种情况。如果您不想针对 Key 保留空产品列表。

    val filteredMap: HashMap<String, Array<Product>> = HashMap()
    data.forEach { (key, value) ->
        val filtered=value.filter {prod-> prod.availableQuantities!=0 }
        if(filtered.isNotEmpty()){
            filteredMap[key]=filtered.toTypedArray()
        }
     }
    

    或者,如果您想针对 Key 保留空列表,则可以尝试以下操作:-

    val filteredMap= data.mapValues { (_, value) ->
        value.filter { it.availableQuantities != 0 }.toTypedArray()
    }
    

    【讨论】:

    • 我喜欢你的回答,谢谢但是,我不知道为什么它不起作用
    • 这个app我调试也被屏蔽了,不知道
    • 我将 try catch 添加到我的代码中,我得到以下异常 java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.models.Product[]
    • 用更新的代码编辑你的问题..我已经测试过这个代码,它应该可以有效地工作..如果你使用Map&lt;String, ArrayList&lt;Product&gt;&gt;而不是Map&lt;String, Array&lt;Product&gt;&gt;,事情会有点容易..
    • 我们无法编写如下代码? " val tempVariant = StreamSupport.stream(data.toList()) .filter { o1 -> o1.second {it -> } .collect(Collectors.toList())"
    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多