2016-04-24 87 views
2

在Seq中获取实例的最佳实践是什么?通过Seq中的字段值比较来查找实例

case class Point(x: Int, y: Int) 
val points: Seq[Point] = Seq(Point(1, 10), Point(2, 20), Point(3, 30)) 

我想获得最多y的点。 (在这种情况下:Point(3, 30)

什么是最好的方式?

+0

如果提供的答案之一解决了您的问题,请接受它来解决问题。谢谢 ! – eliasah

回答

4

最简单的方法是使用TraversableOnce.maxBy

val points: Seq[Point] = Seq(Point(1, 10), Point(2, 20), Point(3, 30)) 

scala> points.maxBy(_.y) 
res1: Point = Point(3,30) 
4

@ YuvalItzchakov的答案是正确的,但这里的另一种方式使用Ordering做到这一点:

val points: Seq[Point] = Seq(Point(1, 10), Point(2, 20), Point(3, 30)) 
// points: Seq[Point] = List(Point(1,10), Point(2,20), Point(3,30)) 

val order = Ordering.by((_: Point).y) 
// order: scala.math.Ordering[Point] = [email protected] 

val max_point = points.reduce(order.max) 
// max_point: Point = Point(3,30) 

points.max(order) 
// Point = Point(3,30) 

或与implicitOrdering

{ 
    implicit val pointOrdering = Ordering.by((_: Point).y) 
    points.max 
} 
// Point = Point(3,30) 

注意TraversableOnce.maxBy也使用隐式排序。 Reference

0

这样做的另一种方法是使用foldleft。

val points:Seq[Point] = Seq(Point(1,10),Point(2,20),Point(3,30)) 
points.foldLeft[Point](Point(0,0)){(z,f) =>if (f.y>z.y) f else z}