Android Kotlin - сумма объектов JSON - PullRequest
0 голосов
/ 21 мая 2018

У меня есть два файла JSON, которые связаны с использованием внешнего ключа / поля (в моем случае один - это Post (id, ...) и Comments (postId, ...)).Мне нужно отобразить общее количество комментариев на пост (в моем случае это всегда 5).

Мои классы данных выглядят следующим образом:

data class Posts(val userId: Int,
                 val id: Int,
                 val title: String,
                 val body: String)

data class Comments(val postId: Int,
                    val id: Int,
                    val name: String,
                    val email: String,
                    val body: String) 

А вот функция, которую я использую дляполучить данные json (я использую okhttp для настройки клиента и gson для получения данных):

private fun fetchCommentJson() {
        val postId = intent.getIntExtra(POST_ID, -1)
        val commentJsonData = commentsJSON

        val client = OkHttpClient()

        val request = Request.Builder().url(commentJsonData).build()
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call?, e: IOException?) {
                toast("Something went wrong fetching your data")
            }

            override fun onResponse(call: Call?, response: Response?) {
                val body = response?.body()?.string()
                val gson = GsonBuilder().create()
                val commentsDetail = gson.fromJson(body, Array<Comments>::class.java)
                val postDetail = gson.fromJson(body, Array<Posts>::class.java)

                runOnUiThread {

                    for (commentSizeList in 0 until commentsDetail.size) {

                        val listOfComments = commentsDetail[commentSizeList] // List of all comments by Index
                        val post = postDetail[postId - 1].id // Post Id

                        // If postId is equal to original post id
                        if (listOfComments.postId == post) {
                            // Print it out
                            println(listOfComments)
                        }
                    }
                }
            }
        })
    }

Когда я распечатываю список, он действительно распечатывает все комментарии по каждому посту на основе егоID (так как сравнение сделано).Однако он печатает каждый комментарий отдельно (и настройка listOfComments.size выводит 1 для каждого комментария).

отображение списка всех комментариев на пост

У меня вопрос, какобъединить их все, чтобы отображалось общее количество комментариев на пост (в данном случае -> 5)?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Таким образом, я бы сделал так:

val totalNumberOfCommentsForPost = commentsDetail?.filter {
    it.postId == post
}?.size ?: 0

.filter выбирает только комментарии с одинаковым идентификатором поста.

Тогда .size получает скольков новом отфильтрованном списке.

И, наконец, в качестве меры предосторожности ?: 0, если какая-либо из этих функций возвращает ноль, затем возвращает 0.

0 голосов
/ 21 мая 2018

Если я правильно понимаю, что вам нужно, вы можете заменить весь цикл for на этот код, используя filter:

// Post Id, the way you've been calculating it
val post = postDetail[postId - 1].id 

// a list of comments only containing the ones that have the ID you need
val filteredComments: List<Comments> = commentsDetail.filter { it.postId == post } 

Отсюда вы можете напечатать либо весьlist:

println(filteredComments)

Или размер списка:

println(filteredComments.size)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...