Scala中的元组排序

Scala中的元组排序,scala,sorting,tuples,Scala,Sorting,Tuples,请帮助我对元组多参数进行排序 Tuple = (Option[String],Option[String],Option[String]) 示例: val lst:List[(Option[String],Option[String],Option[String])] = List( (Some("a"),None,None), (Some("b"),None,None), (Some("a"),Some("a"),None), (Some("a"),Some("b"),Non

请帮助我对元组多参数进行排序

Tuple = (Option[String],Option[String],Option[String])
示例:

val lst:List[(Option[String],Option[String],Option[String])] = List(
  (Some("a"),None,None),
  (Some("b"),None,None),
  (Some("a"),Some("a"),None),
  (Some("a"),Some("b"),None),
  (Some("a"),None,Some("a")),
  (Some("a"),None,Some("b")),
  (Some("a"),None,Some("c")),
  (Some("a"),Some("a"),Some("a"))
  )
println("Sorted list = " + lst.sortBy(e=> (e._1,e._3,e._2)).mkString("\n"))
原始输出

 Sorted list= (Some(a),None,None)
  (Some(a),Some(a),None)
  (Some(a),Some(b),None)
  (Some(a),None,Some(a))
  (Some(a),Some(a),Some(a))
  (Some(a),None,Some(b))
  (Some(a),None,Some(c))
  (Some(b),None,None)
预期输出:

(Some(a),None,None)
(Some(a),Some(a),None)
(Some(a),Some(b),None)
(Some(a),None,Some(a))
(Some(a),Some(a),Some(a)) - This line should be placed at last but one position 
(Some(a),None,Some(b))    - These two lines
(Some(a),None,Some(c))    - should come above the line
(Some(b),None,None)
换句话说,元组中的第一个元素总是“Some”而不是“None”。第二和第三个元素的值可能为“无”

输出应与第一个元素、第二个元素的所有“某些”值和第三个元素的所有“无”值、第三个元素的所有“某些”值和第二个元素的“无”值一起排序。然后,按第二和第三个元素排序(两个值都是“Some”而不是“None”)。预期输出显示了这一点

简单排序,元组中的每个元素都不按预期工作

代码 “未排序”的输入有一点,你可以看到它真的排序

val lst:List[(Option[String],Option[String],Option[String])] = List(
  (Some("a"),None,None),
  (Some("b"),None,None),
  (Some("a"),Some("b"),None),
  (Some("a"),Some("a"),None),
  (Some("a"),None,Some("c")),
  (Some("a"),None,Some("a")),
  (Some("a"),None,Some("b")),
  (Some("a"),Some("a"),Some("a"))
)

def getValue(el : (Option[String],Option[String])) = {
  el match {
    case (None, None) => 0
    case (Some(a), None) => 1
    case (None, Some(b)) => 2
    case (Some(a), Some(b)) => 3
  }
}

lst.sortBy(e => (e._1, getValue(e._2, e._3), e._2, e._3))
在第一个元组、特殊规则、第二个元组和第三个元组之后排序

输出
输出符合预期

为什么
e.\u 1.\u 1
?它不应该是
e.\u 1
?您最好将元组重构为一个case类,并实现
math.Ordering
,因为这将大大提高可读性。我看不出示例和预期输出之间有明显区别。您能更清楚地说明哪一行不是预期的吗?不明白为什么
a,None,None
a,z,None
a,None,b
应该是
a,None,None
a,None,b
a,z,None
?我发现您大量使用了“get tuple”操作符(
,特别是在
e.\u 1.\u 3
unreadable@jony刚刚更新了我的答案,现在它应该适合你的问题。也许它会更漂亮一点,但它确实有效,这很重要:-)简单、整洁、聪明。谢谢
List((Some(a),None,None), 
     (Some(a),Some(a),None), 
     (Some(a),Some(b),None), 
     (Some(a),None,Some(a)), 
     (Some(a),None,Some(b)), 
     (Some(a),None,Some(c)), 
     (Some(a),Some(a),Some(a)), 
     (Some(b),None,None))