我有来自Avro的数据可能为null,我需要对其进行排序。我想要做的是选择列表的第一个记录,但要确保空值是最后一个。
case class Data(k: Int, v: String)
val list = List(Data(42, "xyz"), Data(1, null), Data(1, "baz"))
我想要的是Data(1, "baz")
,因为我想对k
进行排序,然后对v
进行排序,并将所有空值排序到最后。这可能吗?
答案 0 :(得分:2)
使用SortWtih可以帮助我们
val res0 = List((10,null), (1,2), (2,3), (3,null), (4,5))
res0.sortWith( (first, second) => {
if(first._2 == null) false
else if(second._2 == null) true
else false
})
甚至更短
res0.sortWith( _._2 != null && _._2 == null)
结果:
List((1,2), (2,3), (4,5), (10,null), (3,null))
答案 1 :(得分:1)
您可以使用在集合上定义的sortWith函数。
case class Data(k: Int, v: String)
val list = List(Data(42, "xyz"), Data(1, null), Data(1, "baz"))
val sorted = list.sortWith((d1, d2) =>
if (d1.k != d2.k) {
d1.k < d2.k
} else {
if (d1.v == null) false
else if (d2.v == null) true
else d1.v.compareTo(d2.v) == 1
})
println(sorted) // List(Data(1,baz), Data(1,null), Data(42,xyz))