You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对包含两种数据类的ArrayList<Any>按date字段排序?

解决方案:按共有date字段排序混合数据类列表

刚学Kotlin几天就碰到这种实际场景,挺棒的!完全可以实现按date字段排序,我给你两种实用方法,你可以根据自己的情况选择:

方法一:定义公共接口(推荐,代码更优雅易维护)

既然两个数据类都有date字段,我们可以先定义一个包含该属性的接口,让两个数据类都实现它,这样就能统一处理日期属性了。

  1. 先定义接口:
interface HasDate {
    val date: Date
}
  1. 修改你的两个数据类,让它们实现这个接口:
data class TextMessage(
    val content: String,
    override val date: Date,
    val type: Int
) : HasDate

// 假设第二个数据类是这样的(比如content是Int类型)
data class OtherMessage(
    val content: Int,
    override val date: Date
) : HasDate
  1. 对列表进行排序:
    如果可以的话,建议把ArrayList<Any>改成ArrayList<HasDate>,这样类型更安全;如果没法修改原列表类型,也可以先过滤出符合类型的元素再排序:
// 假设你的原始列表是这样的
val messages: ArrayList<Any> = arrayListOf(
    TextMessage("Hello", Date(System.currentTimeMillis() - 1000), 1),
    OtherMessage(123, Date(System.currentTimeMillis())),
    TextMessage("Hi", Date(System.currentTimeMillis() - 2000), 2)
)

// 按date升序排序(降序用sortedByDescending)
val sortedMessages = messages
    .filterIsInstance<HasDate>() // 过滤出实现了HasDate的元素,避免类型错误
    .sortedBy { it.date }

方法二:直接类型判断(适合不想修改原有数据类的场景)

如果不想改动现有的数据类,也可以在排序时用when表达式判断元素类型,取出对应的date字段:

val sortedMessages = messages
    .filter { it is TextMessage || it is OtherMessage } // 先过滤掉无关类型
    .sortedBy { item ->
        when (item) {
            is TextMessage -> item.date
            is OtherMessage -> item.date
            else -> Date(0) // 这里不会执行到,因为已经过滤过类型
        }
    }

小提示

  • 不管是java.util.Date还是Kotlin常用的LocalDateTime这类日期类型,本身都实现了Comparable接口,所以sortBy可以直接生效。
  • 优先推荐第一种方法,后续如果新增带date字段的消息类,只要实现HasDate接口,排序逻辑完全不用改动,扩展性更强。

内容的提问来源于stack exchange,提问作者João Durante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:07:32