【问题标题】:List.dropLast() is returning an Empty ListList.dropLast() 正在返回一个空列表
【发布时间】:2022-01-11 16:42:18
【问题描述】:

我正在开发具有此 DAO 查询的字典应用程序,该查询从数据库中返回 20 个项目。查询工作正常。

@Query("SELECT word, meanings FROM wordentity GROUP BY word ORDER BY id DESC LIMIT 20")
    suspend fun getLastTenWords(): List<Words>

在 ViewModel 中,我将数据库中的单词列表传递给辅助方法以整理列表,即删除重复项、删除大写字母并仅返回前 10 个已清理的项目。

private fun cleanLastTenWords(words: List<Word>): List<String> {
        
        val list = mutableListOf<String>()

        for (word in words) {

            list.add(word.word.lowercase())

        }

        return list.distinct()
                .dropLast(10)}

数据库从零项开始,但是当用户搜索字典时,该词被插入到数据库中。

问题在于最初会返回一个空列表,直到插入 11 个项目。在第 11 项,返回 1 个单词项的列表。在第 12 项,数据库返回 2 个单词项的列表,依此类推。

问题是由dropLast() 调用引起的。这是因为当我注释掉 dropLast(10) 时,代码运行良好,但返回 超过 10 个 个单词项。

我需要的只是前 10 个单词项目的列表 - 例如,如果数据库有 3 个项目,它应该只返回 3 个项目而不是返回一个空列表。如果列表有 15 个项目,我只需要前 10 个项目并丢弃第 10 个项目之后的任何其他项目。

我哪里出错了?

【问题讨论】:

  • 我想你想写 return list.distinct().take(10) 以便保留前 10 个元素。这不是你想要达到的目标吗?
  • take(10) 工作正常,非常感谢@F.Mysir,你是个传奇!

标签: android list kotlin


【解决方案1】:

感谢上面 F.Mysir 的评论,最简单的答案是 return list.distinct().take(10)

也可以使用if-else 检查列表中包含的项目数。

private fun cleanLastTenWords(words: List<Word>): List<String> {
        
        val list = mutableListOf<String>()

        for (word in words) {

            list.add(word.word.lowercase())

        }

     /*return list.distinct().take(10)*/

        return if (list.size > 10) 

               list.distinct().dropLast(10) 

               else 

               list.distinct()

    }

【讨论】:

  • 您可能应该提到,如果您最多有 20 个元素,则此替代方案将返回不超过 10 个元素。如果你得到 30,这将返回 20。我会说这是一个非常具体的替代方案,它太窄了,不会真正帮助很多人,而且考虑到直接和简单的解决方案,这是不必要的。
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多