2015-06-03 3 views
0

Я хотел бы найти объект с максимальным значением int из последовательности с использованием методов Scala zip и max. Например, у меня есть сложный объект с вложенным объектом.Как найти максимальное значение в последовательности объектов?

case class A(prop1: String, b: B, prop2:String) 
case class B(val:Int, prop1: String) 

Seq[A] 

ответ

5

Вы можете использовать maxBy в последовательности. Например (отредактированный слегка так, что он будет компилировать):

case class B(value: Int, prop1: String) 
case class A(prop1: String, b: B, prop2: String) 

val as = Seq(
    A("", B(10, ""), ""), 
    A("foo", B(1, "bar"), "qux"), 
    A("John", B(3, "Mary"), "Bob") 
) 

И потом:

scala> as.maxBy(_.b.value) 
res0: A = A(,B(10,),) 

Аргумент maxBy это просто функция от A к чему-то, что компилятор может сказать, как заказать (более конкретно, все с экземпляром Ordering). Компилятор знает, как сравнивать целые числа, поэтому мы можем просто использовать _.b.value, что является сахаром для чего-то вроде (a: A) => a.b.value.

Вы также могли бы обеспечить Ordering экземпляр для A и просто использовать max:

scala> implicit val orderingA: Ordering[A] = Ordering.by(_.b.value) 
orderingA: Ordering[A] = [email protected] 

scala> as.max 
res1: A = A(,B(10,),) 

Но maxBy, вероятно, больше подходит для разового работы.