如何按照两个字段对Scala中的列表进行排序?在这个例子中,我将按照lastName和firstName进行排序。
case class Row(var firstName: String, var lastName: String, var city: String)
var rows = List(new Row("Oscar", "Wilde", "London"),
new Row("Otto", "Swift", "Berlin"),
new Row("Carl", "Swift", "Paris"),
new Row("Hans", "Swift", "Dublin"),
new Row("Hugo", "Swift", "Sligo"))
rows.sortBy(_.lastName)
我尝试类似这样的东西
rows.sortBy(_.lastName + _.firstName)
但是它没有起作用。因此,我很好奇是否有一个好而简单的解决方案。
Row
类创建自己的Ordering
,并像这样使用sorted
方法:rows.sorted(customOrdering)
。你还可以像这样为Tuple2
使用自定义的Ordering
:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
。 - seniaOrdering[Row]
或使用Ordering.by
来实现customOrdering
,例如:val customOrdering = Ordering.by((r: Row) => (r.lastName, r.firstName))(Ordering.Tuple2(Ordering.String.reverse, Ordering.String))
。 - seniarows.sortBy(r => (-r.field1, -r.field2))
。 - Brent FaustString
中的-
。你应该这样使用Ordering::reverse
:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
。 - senia