请帮我对元组多参数进行排序。
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”值来自第三个,然后所有“Some”值来自第三个元素,“None”元素来自第二个元素。之后,按第二和第三个元素排序(两个值都是“Some”而不是“None”)。预期的输出显示了这一点。
元组中每个元素的简单排序不按预期工作。
答案 0 :(得分:2)
“未分类”输入一点点,你可以看到它真正排序。
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))
在第一个元组,“特殊规则”,第二元组和第三元组之后排序。
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))
按预期输出。