Scala 中 ListBuffer[Set[Int]] 中的依赖项
Dependencies in a ListBuffer[Set[Int]] in Scala
我正在解决一个问题,我得到了这个:
ant : scala.collection.mutable.ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1), Set(2), Set(1), Set(3,4), Set(5, 6), Set(7))
ListBuffer中的Set表示依赖关系,例如:ant(1)是Set(0),也就是说ant(1)依赖于ant(0),即Set()。和其他的一样,另一个例子:ant(7) 是 Set(5, 6) 这意味着 ant(7) 依赖于 ant(5) 和 ant(6).
我需要获取的是一个新的ListBuffer[Set[Int]],其中所有Set之间的依赖没有重复,例如:ant(6) depends of ant(3) and ant(4),在同时 ant(3) 依赖于 ant(1) 并且 ant(4) 依赖于 ant(2),而 ant(1) 和 ant(2) 依赖于 ant(0),所以所有依赖项的结果在ant(6) 是:Set(3,4,1,2,0)
所以初始ListBuffer的结果应该是:
solution : scala.collection.mutable.ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1,0), Set(2,0), Set(1,0), Set(3,4,1,2,0), Set(5,6,1,3,4,0,2), Set(7,5,6,1,0,4,3,2))
哪种方法最好?
谢谢。
对于您要表示的内容,这绝对是错误的数据结构。要获得您想要的结果,您将不得不经历一系列比数据结构本身更复杂的步骤。
所以我们从这里开始。
import collection.mutable.ListBuffer
val ant: ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1), Set(2),
Set(1), Set(3,4), Set(5, 6), Set(7))
现在我们需要将 sub-dependencies 添加到每个当前的依赖集。由于这些是 Int
中的 Set
,因此显示顺序无关紧要。
ant.map(_.flatMap(x => ant(x) + x))
// ListBuffer(Set(), Set(0), Set(0), Set(0, 1), Set(0, 2), Set(0, 1), Set(1, 3, 2, 4), Set(5, 1, 6, 3, 4), Set(5, 6, 7))
现在我们需要重复这个过程,直到新的结果与之前的结果相同。 Stream
迭代器将设置重复,我们将 dropWhile
每个元素都与前一个不同。
// a ListBuffer Stream
val lbStrm: Stream[ListBuffer[Set[Int]]] =
Stream.iterate[ListBuffer[Set[Int]]](ant)(_.map(_.flatMap(x => ant(x) + x)))
// grab the first one after the results settle
lbStrm.zipWithIndex.dropWhile{case (lb,x) => lb != lbStrm(x+1)}.head._1
// ListBuffer(Set(), Set(0), Set(0), Set(0, 1), Set(0, 2), Set(0, 1), Set(0, 1, 2, 3, 4), Set(0, 5, 1, 6, 2, 3, 4), Set(0, 5, 1, 6, 2, 7, 3, 4))
不漂亮,但可行。重新设计那个起始数据结构会好得多。
我正在解决一个问题,我得到了这个:
ant : scala.collection.mutable.ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1), Set(2), Set(1), Set(3,4), Set(5, 6), Set(7))
ListBuffer中的Set表示依赖关系,例如:ant(1)是Set(0),也就是说ant(1)依赖于ant(0),即Set()。和其他的一样,另一个例子:ant(7) 是 Set(5, 6) 这意味着 ant(7) 依赖于 ant(5) 和 ant(6).
我需要获取的是一个新的ListBuffer[Set[Int]],其中所有Set之间的依赖没有重复,例如:ant(6) depends of ant(3) and ant(4),在同时 ant(3) 依赖于 ant(1) 并且 ant(4) 依赖于 ant(2),而 ant(1) 和 ant(2) 依赖于 ant(0),所以所有依赖项的结果在ant(6) 是:Set(3,4,1,2,0)
所以初始ListBuffer的结果应该是:
solution : scala.collection.mutable.ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1,0), Set(2,0), Set(1,0), Set(3,4,1,2,0), Set(5,6,1,3,4,0,2), Set(7,5,6,1,0,4,3,2))
哪种方法最好?
谢谢。
对于您要表示的内容,这绝对是错误的数据结构。要获得您想要的结果,您将不得不经历一系列比数据结构本身更复杂的步骤。
所以我们从这里开始。
import collection.mutable.ListBuffer
val ant: ListBuffer[Set[Int]] = ListBuffer(Set(), Set(0), Set(0), Set(1), Set(2),
Set(1), Set(3,4), Set(5, 6), Set(7))
现在我们需要将 sub-dependencies 添加到每个当前的依赖集。由于这些是 Int
中的 Set
,因此显示顺序无关紧要。
ant.map(_.flatMap(x => ant(x) + x))
// ListBuffer(Set(), Set(0), Set(0), Set(0, 1), Set(0, 2), Set(0, 1), Set(1, 3, 2, 4), Set(5, 1, 6, 3, 4), Set(5, 6, 7))
现在我们需要重复这个过程,直到新的结果与之前的结果相同。 Stream
迭代器将设置重复,我们将 dropWhile
每个元素都与前一个不同。
// a ListBuffer Stream
val lbStrm: Stream[ListBuffer[Set[Int]]] =
Stream.iterate[ListBuffer[Set[Int]]](ant)(_.map(_.flatMap(x => ant(x) + x)))
// grab the first one after the results settle
lbStrm.zipWithIndex.dropWhile{case (lb,x) => lb != lbStrm(x+1)}.head._1
// ListBuffer(Set(), Set(0), Set(0), Set(0, 1), Set(0, 2), Set(0, 1), Set(0, 1, 2, 3, 4), Set(0, 5, 1, 6, 2, 3, 4), Set(0, 5, 1, 6, 2, 7, 3, 4))
不漂亮,但可行。重新设计那个起始数据结构会好得多。