如何对包含两种数据类的ArrayList<Any>按date字段排序?
解决方案:按共有date字段排序混合数据类列表
刚学Kotlin几天就碰到这种实际场景,挺棒的!完全可以实现按date字段排序,我给你两种实用方法,你可以根据自己的情况选择:
方法一:定义公共接口(推荐,代码更优雅易维护)
既然两个数据类都有date字段,我们可以先定义一个包含该属性的接口,让两个数据类都实现它,这样就能统一处理日期属性了。
- 先定义接口:
interface HasDate { val date: Date }
- 修改你的两个数据类,让它们实现这个接口:
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
- 对列表进行排序:
如果可以的话,建议把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
相关产品推荐
相关产品推荐

