【问题标题】:Calculate average from MutableCollection<Any!>?从 MutableCollection<Any!> 计算平均值?
【发布时间】:2022-12-12 05:28:08
【问题描述】:

我刚刚开始使用 Firestore 服务器来存储我的 Android 应用程序中的值。我已经检索到这些值,现在想计算它们的平均值。我最初的想法是获取值,将它们转换为浮点数(有小数,所以我猜这是最好的格式)然后计算平均值以显示。然而,这其中的一部分不起作用,所以我想知道是否有更优化的方法。

当前代码:

val map = document.data?.values //gets values from the hashmap
Log.d("firestore", "values1 = $map")
val map2 = map.toString() //converts them to string
Log.d("firestore", "values2 = $map2")
val map3 = map2.toFloat() //converts them to a float??
Log.d("firestore", "values3 = $map3")

浮点数部分也返回随机数字,例如字符串是[5.0, 5.0],浮点数返回[91.0, 53.0, 46.0, 48.0, 44.0, 32.0, 53.0, 46.0, 48.0, 93.0]。任何有关如何转换值以便计算值的平均值的帮助,将不胜感激!

【问题讨论】:

    标签: android kotlin google-cloud-firestore


    【解决方案1】:

    你能提供输入(document.data)和实际的日志输出吗?与任何提供答案的人一样,查看 Kotlin 推断的数据类型也将有助于您的理解。

    我假设您的问题中的第一个变量 mapMutableCollection&lt;Any!&gt;。称它为 map 是一种误导,因为 map 是一个键/值结构,需要两种类型来描述它。

    当您在 Collection 上调用 toString() 时,您将获得一个字符串表示形式。所以我可以相信输出确实是[5.0, 5.0]。然后尝试将其转换为浮点数是没有意义的,因为整个字符串不是浮点数。

    你正在以错误的方式解决这个问题。

    首先,您需要将 Collection&lt;Any!&gt; 转换为强类型数组,以便您可以对其进行适当的数学运算。

    让我们从一些我们可以看到的数据开始

    val source : MutableMap<String, Any> = mutableMapOf("n1" to 2.0, "n2" to 3.5, "s1" to "fish", "n3" to 4.5)
    val listOfAll: MutableCollection<Any> = source.values
    println("listOfAll=$listOfAll")
    

    这产生

    listOfAll=[2.0, 3.5, fish, 4.5]
    

    我们无法执行计算,所以让我们过滤掉任何不是数字的东西

    val listOfOnlyNumbers = listOfAll.filterIsInstance<Number>()
    println("listOfOnlyNumbers=$listOfOnlyNumbers")
    

    这产生

    listOfOnlyNumbers=[2.0, 3.5, 4.5]
    

    现在有一个内置的平均函数,但是 Number 是抽象的,所以我们需要转换为一个具体的类。 Float 可以,但大多数人通常会使用 Double(精度低于 Float)。如果这些值是DecimalBigDecimal 更好,因为它针对小数进行了优化,因此您不会得到12.340000000000001 之类的东西。

    val listOfDoubles = listOfOnlyNumbers.map { it.toDouble() }
    val average = listOfDoubles.average()
    println("average=$average")
    

    哪个产生你可能想要的

    average=3.3333333333333335
    

    (注意原始收藏品多了一个价值,没有考虑到平均划分)

    所以总而言之,你想要的归结为

    val average = document.data?.values
       .filterIsInstance<Number>()
       .map { it.toDouble() }
       .average()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多