Scala中集合的向量序列中每个向量的第一个条目

时间:2019-07-01 14:52:13

标签: scala functional-programming

我有一组整数集向量。我想要每个向量中的第一个条目。我的尝试只是给我第一个向量中的每个项目。

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 个答案:

答案 0 :(得分:3)

(1 to 4).map((10 to 13).toSet.subsets(_).toVector).flatMap(_.headOption)

您正在获取外部向量的头部,而不是外部向量的每个分量的头部。请注意,这里使用flatMapheadOption较为安全:head会在空集合上崩溃。

答案 1 :(得分:3)

很简单:

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

_.head选择每个Set中的第一个元素。

作为奖励知识,_.tail会选择除每个Set的开头以外的所有内容。

Try it out!

我希望这会有所帮助。

答案 2 :(得分:2)

您已经足够亲密,您不希望第一个向量的第一个条目,而是每个向量的第一个条目。这是地图,因为您正在转换集合。

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)

答案 3 :(得分:1)

您可以使用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)