Составление списка всех пар
Я новичок в Scala, имея очень ограниченный опыт работы с функциональным программированием через Haskell.
Я хотел бы попробовать составить список всех возможных пар, построенных из одного входного списка. Пример:
val nums = List[Int](1, 2, 3, 4, 5) // Create an input list
val pairs = composePairs(nums) // Function I'd like to create
// pairs == List[Int, Int]((1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1) ... etc)
Я попытался с помощью zip
на каждом элементе со всем списком, надеясь, что он будет дублировать один элемент по всему целому. Это не сработало (только соответствовало первой возможной паре). Я не уверен, как повторить элемент (Haskell делает это с cycle
и take
Я считаю), и у меня были проблемы с документацией по Scala.
это заставляет меня думать, что, вероятно, есть более краткий, функциональный способ получить результаты, которые я хочу. У кого-нибудь есть хорошее решение?
3 ответов
для тех из вас, кто не хочет повторений:
val uniquePairs = for {
(x, idxX) <- nums.zipWithIndex
(y, idxY) <- nums.zipWithIndex
if idxX < idxY
} yield (x, y)
val nums = List(1,2,3,4,5)
uniquePairs: List[(Int, Int)] = List((1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5))
вот еще одна версия с использованием map и flatten
val pairs = nums.flatMap(x => nums.map(y => (x,y)))
List[(Int, Int)] = List((1,1), (1,2), (1,3), (1,4), (1,5), (2,1), (2,2), (2,3), (2,4), (2,5), (3,1), (3,2), (3,3), (3,4), (3,5), (4,1), (4,2), (4,3), (4,4), (4,5), (5,1), (5,2) (5,3), (5,4), (5,5))
Это можно легко обернуть в функцию composePairs, если вам нравится:
def composePairs(nums: Seq[Int]) =
nums.flatMap(x => nums.map(y => (x,y)))