как взять каждый предмет со всеми пунктами справа от него в списке?[Scala] - PullRequest
0 голосов
/ 17 ноября 2018

Предположим, у меня есть 1d массив или список в следующем виде:

val a = Array(1, 5, 7, 9)

Я хочу получить результат (2d массив или список кортежей), где

Array[(1,5), (1,7), (1,9), (5,7), (5,9), (7,9)]

Как можноЯ делаю это в Скала?

Вот что я попробовал:

val c = for (a_ <- a; b_ <- a) yield (a_, b_)

Проблема c теперь имеет:

Array((1,1), (1,5), (1,7), (1,9), (5,1), (5,5), (5,7), (5,9), (7,1), (7,5), (7,7), (7,9), (9,1), (9,5), (9,7), (9,9))

, что является неправильным результатом, потому что это не декартово произведение!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Вот как я это решил: лучшее, что я мог:

var tmpRes: ListBuffer[List[(Int, Int)]] = ListBuffer()
(0 until itemSet.size) foreach { i =>
      val left = List(itemSet(i))
      val (_, right) = itemSet.splitAt(i+1)
      val res:List[(Int, Int)] = for (left_ <- left; right_ <- right) yield (left_, right_)
      tmpRes += res
}

var combinations: ListBuffer[(Int, Int)] = tmpRes.flatMap(x => x)
combinations.foreach(println)

Если у кого-то есть лучшее решение, поделитесь им :)

0 голосов
/ 17 ноября 2018

Хотите сократить код? Вот однострочник.

a.zipWithIndex.flatMap{case (n,x) => a.drop(x+1).map(n -> _)}
//res0: Array[(Int, Int)] = Array((1,5), (1,7), (1,9), (5,7), (5,9), (7,9))

Или, может быть, это.

a.combinations(2).map(x=>(x(0),x(1))).toArray
...