我有两个不同的Data类的数组列表,如下所示:
class Record{
var id: Long = 0
var RecordId: Int = 0
var Record: String? = null
var title: String? = null
var description: String? = null
var longDate: Long = 0
}
class Type{
var id: Long = 0
var typeId: Int = 0
var subTypeId: Int = 0
var typeString: String? = null
var longDate: Long = 0
}
var recordsList: ArrayList<Record>
var typesList: ArrayList<Type>
现在,我想要一个这两个对象的合并列表,它将基于两个对象(即longDate
)中的公共字段进行排序。我尝试过.associate , sortedBy, sortedWith(compareBy<>)
等,但未能达到预期的结果。
在这里,还有一点需要注意的是,在比较两个列表时,它们中的一个可能是空的。
这将产生一个List<Any>
,其中所有项目按longDate
排序:
(recordsList + typesList)
.sortedBy {
when (it) {
is Record -> it.longDate
is Type -> it.longDate
else -> error("")
}
}
或者您可以考虑创建一个具有val longDate: Long
的接口,这两个类都实现了。这样,您就不需要when
表达式,并且您的List将是接口的类型。
这样的东西应该可以工作,但我个人认为这是相当的代码气味。不能保证Record.longDate
与Type.longDate
确实是同一类型(我们知道它是,因为我们创建了模型,但编译器永远不会知道)。
val result = (recordsList + typesList).sortedBy {
when(it){
is Record -> it.longDate
is Type -> it.longDate
else -> error("incompatible list element $it")
}
}
它的工作原理是这样的:(我已经从模型中删除了一些参数,因为它们在这里并不算)
fun main() {
val recordsList = listOf(Record().apply { longDate = 5 }, Record().apply { longDate = 3})
val typesList = listOf(Type().apply { longDate = 3 }, Type().apply { longDate = 2 })
val result = (recordsList + typesList).sortedBy {
when(it){
is Record -> it.longDate
is Type -> it.longDate
else -> error("incompatible list element $it")
}
}
result.forEach{
println(it.toString())
}
}
class Record{
var longDate: Long = 0
override fun toString(): String {
return "Record(longDate=$longDate)"
}
}
class Type{
var longDate: Long = 0
override fun toString(): String {
return "Type(longDate=$longDate)"
}
}
这将输出:
Type(longDate=2)
Record(longDate=3)
Type(longDate=3)
Record(longDate=5)
以一种更通用的方式来做,这样你就可以创建一个有趣的地方,你可以声明每个对象类型中使用的哪个属性最有可能使用反射,这是我无论如何都要避免的。
所以我肯定会考虑一个对象是否可以继承另一个对象,或者创建一个接口,或者其他任何东西。
我将以两个问题结束:为什么没有构造函数?为什么是ArrayList而不是list?