В Scala, У меня есть последовательность val test : Seq[String] = Seq("table","bag","chair","chair")

Я хочу сгенерировать все комбинации приведенной выше последовательности, причем порядок важен, а также подсчитать, сколько раз эта комбинация присутствует в последовательности. т.е. (table,bag,1), (table,chair,2), (bag,table,1), (bag,chair,2), (chair,table,1), (chair,bag,2).

Кроме того, мне не нужно рассматривать комбинацию одного и того же элемента, т.е. (chair,chair) следует игнорировать. Как я мог это сделать?

0
Jeet Banerjee 22 Окт 2018 в 20:33

2 ответа

Лучший ответ

Если подумать, счет для любой комбинации (спаривания) - это количество 1-го элемента, умноженное на количество 2-го элемента.

val ws = Seq("table","bag","chair","chair")
val count = ws.groupBy(identity).mapValues(_.length)
val result = ws.distinct.combinations(2).flatMap{ case Seq(a,b) =>
    val comboCount = count(a) * count(b)
    Seq((a,b,comboCount), (b,a,comboCount))
}
0
jwvh 22 Окт 2018 в 18:00

Вы можете сделать это так:

val ans: Seq[(String, String)] = for {
    a <- test
    b <- test
    if a != b
  } yield {
      (a, b)
  }

    val result: Iterator[(String, String, Int)] = ans.groupBy(identity).mapValues(_.length).toIterator.map{
    case ((key, value), frequency)=> (key, value, frequency)
  }

  result1.foreach(println)

< Сильный > Выход

(bag,table,1)
(table,chair,2)
(chair,table,2)
(chair,bag,2)
(bag,chair,2)
(table,bag,1)
0
Raman Mishra 22 Окт 2018 в 18:18
52934773