在Scala中对元组进行排序

时间:2016-03-14 13:36:23

标签: 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"),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”)。预期的输出显示了这一点。

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

1 个答案:

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

按预期输出。