在Scala列表中最后排序无

时间:2017-10-03 13:43:23

标签: scala

我有来自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进行排序,并将所有空值排序到最后。这可能吗?

2 个答案:

答案 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))