Первая запись в каждом из векторов из последовательности векторов множеств в Scala - PullRequest
1 голос
/ 01 июля 2019

У меня есть последовательность Векторов Наборов Интентов.Я хочу первую запись в каждом из векторов.Моя попытка просто дает мне каждый элемент в первом векторе.

scala> (1 to 4).map((10 to 13).toSet.subsets(_).toVector)
res112: scala.collection.immutable.IndexedSeq[Vector[scala.collection.immutable.Set[Int]]] = Vector(Vector(Set(10), Set(11), Set(12), Set(13)), Vector(Set(10, 11), Set(10, 12), Set(10, 13), Set(11, 12), Set(11, 13), Set(12, 13)), Vector(Set(10, 11, 12), Set(10, 11, 13), Set(10, 12, 13), Set(11, 12, 13)), Vector(Set(10, 11, 12, 13)))

scala> (1 to 4).map((10 to 13).toSet.subsets(_).toVector).mkString("\n")
res113: String =
Vector(Set(10), Set(11), Set(12), Set(13))
Vector(Set(10, 11), Set(10, 12), Set(10, 13), Set(11, 12), Set(11, 13), Set(12, 13))
Vector(Set(10, 11, 12), Set(10, 11, 13), Set(10, 12, 13), Set(11, 12, 13))
Vector(Set(10, 11, 12, 13))

scala> (1 to 4).map((10 to 13).toSet.subsets(_).toVector).take(1).mkString("\n")
res114: String = Vector(Set(10), Set(11), Set(12), Set(13))

scala> (1 to 4).map((10 to 13).toSet.subsets(_).toVector).head.mkString("\n")
res115: String =
Set(10)
Set(11)
Set(12)
Set(13)

Я пытаюсь получить:

Set(10) 
Set(10, 11)
Set(10, 11, 12)
Set(10, 11, 12, 13)

Ответы [ 4 ]

3 голосов
/ 01 июля 2019

Это просто:

val vec = (1 to 4).map((10 to 13).toSet.subsets(_).toVector)
val res = vec.map(_.head)

_.head выбирает первый элемент каждого Set.

В качестве бонусного знания, _.tail выберет все, кроме головы каждого Set.

Попробуйте!

Надеюсь, это поможет.

3 голосов
/ 01 июля 2019
(1 to 4).map((10 to 13).toSet.subsets(_).toVector).flatMap(_.headOption)

Вы взяли голову внешнего вектора, а не голову каждого компонента внешнего вектора.Обратите внимание, я использую flatMap и headOption здесь, так как это безопаснее: head вылетит в пустой коллекции.

2 голосов
/ 01 июля 2019

Вы были достаточно близко, вам не нужна первая запись первого вектора, а, скорее, первая запись каждого вектора. Это карта , потому что вы преобразуете коллекцию.

val vectors = (1 to 4).map((10 to 13).toSet.subsets(_).toVector)
val firstSets = vectors .map(_.head)

firstSets.mkString("\n")
// Set(10)
// Set(10, 11)
// Set(10, 11, 12)
// Set(10, 11, 12, 13)
1 голос
/ 01 июля 2019

Можно использовать scanLeft:

(10 to 13).scanLeft(Set.empty[Int])((a,b)=> a + b ).tail.mkString("\n")

На консоли:

scala> (10 to 13).scanLeft(Set.empty[Int])((a,b)=> a + b ).tail.mkString("\n")
res41: String =
Set(10)
Set(10, 11)
Set(10, 11, 12)
Set(10, 11, 12, 13)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...