Я пытаюсь получить цифры из рейтинга и суммировать их, чтобы рассчитать среднее значение, но он печатает детали отдельно

# #android-studio #kotlin #firebase-realtime-database

Вопрос:

Я попытался разместить массив снаружи и внутри. Если я помещу его снаружи, он примет только одно значение. Если я помещу его внутрь, он напечатает значения по-другому, поэтому, когда я пытаюсь сложить значения вместе. он по-прежнему печатается отдельно. Я прикрепил структуру firebase в виде изображения. Я очень новичок как в Котлине, так и в Firebase

 private fun loadAverageRating() {
    database = FirebaseDatabase.getInstance()
    databaseReference = database?.reference!!.child("profile")
    val storereference = databaseReference?.child(shopid.text.toString())?.child("rating")

  
    storereference?.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapShot: DataSnapshot) {
            if (dataSnapShot.exists()) {
                dataSnapShot.children.forEach {

                    for (promoSnapshot in it.children) {
                        //averageRating = promoSnapshot.getValue(String::class.java)?.toFloat()!!
                        averageRating = promoSnapshot.getValue().toString().toFloat()

                        val total = listOf(averageRating)
                        //averageArrayRating!!.add(averageRating!!)

                        Log.d("test",total.sum().toString())
                   }
                }
            }
        }
        override fun onCancelled(databaseError: DatabaseError) {
            return
        }
    })
}
 

Структура Огневой Базы

Ответ №1:

Это никак не может сработать, если вы объявляете переменную, которая будет содержать среднее значение внутри цикла, потому что оно будет сброшено для каждого отдельного элемента.

И я не могу прокомментировать, что было не так, когда у вас это было вне цикла, потому что вы не поделились этим кодом. Если бы я собирался выполнить итерацию, чтобы найти сумму, это выглядело бы так:

 for (child in dataSnapShot.children) {
    var total = 0f
    for (grandchild in child.children) {
        total  = grandchild.value.toString().toFloat()
    }
    val average = total / child.children.size
    Log.d("avg","The average of $child is $average")
}
 

Альтернативный способ вместо итерации состоит sumOf в том, чтобы выбрать значения, которые вы хотите добавить, и он суммирует их для вас (на самом деле он все еще повторяется за кулисами). Имейте в виду, что он работает с двойниками, а не с поплавками. Затем просто разделите на размер, чтобы получить среднее значение.

 for (child in dataSnapShot.children) {
    val promos = child.children
    val sum = promos.sumOf { it.value.toString().toDouble() }
    val average = sum / promos.size
    Log.d("avg","The average of $child is $average")
}
 

Комментарии:

1. эй, брат, спасибо тебе за решение, но, похоже, есть проблема с детским размером.дети.часть .. Android Studio не позволяет мне использовать .размер

2. и значения все еще не складываются .. он отображается отдельно.. точно так же, как работал мой предыдущий код …..