如何创建一个排序合并列表从两个不同的ArrayList的对象基于一个共同的值字段在Kotlin? &g



我有两个不同的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.longDateType.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?

最新更新