Как найти max в списке кортежей?

У меня есть следующий список кортежей:

val arr = List(('a',10),('b',2),('c',3))

Как найти кортеж с максимальным ключом или максимальным значением?

Правильный ответ должен быть (c, 3) для максимальной клавиши лексикографически или ('a', 10) для максимального значения.

Ответ 1

Easy-Peasy:

scala> val list = List(('a',10),('b',2),('c',3))
list: List[(Char, Int)] = List((a,10), (b,2), (c,3))

scala> val maxByKey = list.maxBy(_._1)
maxByKey: (Char, Int) = (c,3)

scala> val maxByVal = list.maxBy(_._2)
maxByVal: (Char, Int) = (a,10)

В принципе, вы можете предоставить List[T] любую функцию T => B (где B может быть любым упорядоченным типом, например Int или String на пример), который будет использоваться для нахождения максимума.

Ответ 2

Без сомнения, @om-nom-nom предоставил краткий, правильный ответ. Однако он будет генерировать исключение для пустого списка.

РЕДАКТИРОВАТЬ # 2 Учитывая мое первое редактирование, стоит перезаписать мой оригинальный, ошибочный ответ:

def max[A](list: List[(A, Int)]): Option[Int] = list match  {
    case Nil => None
    case x :: xs => { val result = xs.foldLeft(x._2) { // acc = first item in list                                        
                              (acc, elem) => if(elem._2 > acc) elem._2 else acc 
                      }
                      Some(result)
                    }
} 

Примечание. Я предполагаю, что scalaz позволит вам использовать более общий Num вместо Int, но я не работал с ним вообще.

Тестирование

scala> val list = List(('a',10),('b',2),('c',3))
list: List[(Char, Int)] = List((a,10), (b,2), (c,3))

scala> max(list)
res5: Option[Int] = Some(10)

scala> val list: List[(String, Int)] = Nil
list: List[(String, Int)] = List()

scala> max(list)
res6: Option[Int] = None

РЕДАКТИРОВАТЬ. Чтобы выбрать начальное значение, я решил отредактировать свой ответ после обсуждения с DustinGetz.

Выбор Int.MinValue может быть не лучшим выбором, поскольку он зависит от конкретной ОС/системы, на которой работает приложение.

Я бы сказал, что первым элементом в списке должно быть начальное значение. Однако существует потенциальное исключение во время выполнения, если список пуст.

Пожалуйста, посмотрите этот пост для дальнейшего обсуждения - fooobar.com/info/487056/....