Как найти 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/....