当前位置: 首页 > 知识库问答 >
问题:

为什么sortedBy函数复制了我的列表?

卫嘉言
2023-03-14

我需要在directmessages列表中执行两个进程

1.标记最后一封邮件

2.按时间戳降序排序

当我同时做其中一个时,它们做得很好,但当我同时做两个时,列表中的一些项目重复;这里可以看到我的代码:

fun List<DirectMessage>.doProcesses(): List<DirectMessage> {
    for (i in this.indices) {
        if (i == 0) {
            this[i].isLastMessage = true
            continue
        }
        this[i].isLastMessage =
            this[i - 1].senderUserId != this[i].senderUserId
    }
    return sortedByDescending { it.timestamp }
}

DirectMessage数据类:

data class DirectMessage(
    val messageId: Int,
    val text: String,
    val timestamp: Long,
    val senderUserId: Int,
    var isLastMessage: Boolean = true
)

共有2个答案

皇甫德庸
2023-03-14

你的列表是不变的吗?如果是的话,在我看来它应该返回另一个列表,这样就不会修改一个不可变的列表。

说明:

不可变列表,如其名称所示,在实例化后不能修改。就像任何不可变的对象一样。因此,当您想要更新一个不可变的对象时,您必须返回一个包含要修改和更新的元素的新实例。这避免了典型的副作用,例如在Java可以发现。

最后,如果您真的想要修改您的列表而不返回新实例,那么您应该使用可变列表。

宁飞宇
2023-03-14

所有以sortedby为前缀的Kotlin函数都会生成一个新列表,它表示原始列表的排序副本。

您需要的是就地排序,这可以使用sortby函数来实现。但是,它们显然适用于可变数据结构,如mutableListarray

 类似资料:
  • 可能重复:< br >什么是复制省略和返回值优化? 我有以下程序: 我期望的输出如下: 但我得到以下信息: 问题是:为什么不将对象从func返回到main调用我的复制构造函数?

  • 可能重复:< br >什么是复制省略和返回值优化? 我很难理解为什么在下面的代码中没有调用复制构造函数。 有人能解释一下为什么只调用构造函数,不调用复制构造函数吗?< br >谢谢。

  • 我仍在学习封装。我有一个,其中每个emcapsulated都有一个数组,以及它们的所有设置程序 现在在我的程序中,我注意到数组listRule(其中添加了与语法相关的规则)在每次添加新语法时都会被覆盖。我已经能够识别出错误发生在会清空listRule中所有其他语法的内容,因此listRule似乎对所有语法都是一样的。我的数组listRule创建不正确还是我的循环?

  • 问题内容: Java为什么不支持C ++中的复制构造函数? 问题答案: Java。只是没有像在C ++中那样隐式地调用它们,我怀疑这是您的真正问题。 首先,复制构造函数无非是: 现在,C ++将使用以下语句隐式调用复制构造函数: 在这种情况下,克隆/复制在Java中根本没有意义,因为所有b1和b2都是引用,而不是像C 中那样的值对象。在C 中,该语句复制对象的状态。在Java中,它只是复制 引用

  • 问题内容: 我创建了一个将列表作为参数的函数。它会随机排列列表,替换第一个元素,然后返回新列表。 改组对我的问题没有影响。但是,我很惊讶地看到返回的importedList覆盖了原始的firstList。 通过在函数中复制列表,我找到了一种解决方法,但是效率似乎很低。 我的问题是为什么该函数替换firstList?例如,如果是字符串,则不会发生这种情况。 问题答案: 字符串,整数,元组是不可变的p

  • 我今天想使用,但出现了如下错误: 所以我想我应该清除并重新安装(如下所示)https://www.rosehosting.com/blog/how-to-install-pip-on-ubuntu-16-04/)但仍然得到: 我怎样才能提高我的水平