Scala中ListBuffer[Set[Int]]中的依赖项

Scala中ListBuffer[Set[Int]]中的依赖项,scala,set,listbuffer,Scala,Set,Listbuffer,我正在解决一个问题,我发现: 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中的集合表示依赖关系,例如:ant1是集合0,这意味着ant1依赖于集合ant0。和其他的一样,另一个例子是:ant7是Set5,6,这意味着ant7依赖于ant5和

我正在解决一个问题,我发现:

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中的集合表示依赖关系,例如:ant1是集合0,这意味着ant1依赖于集合ant0。和其他的一样,另一个例子是:ant7是Set5,6,这意味着ant7依赖于ant5和ant6

我需要得到的是一个新的ListBuffer[Set[Int]],其中包含集合之间的所有依赖项,不重复,例如:ant6依赖于ant3和ant4,同时ant3依赖于ant1和ant4依赖于ant2,ant1和ant2依赖于ant0,因此ant6中所有依赖项的结果是:Set3,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))
现在我们需要将子依赖项添加到每个当前的依赖项集中。因为这些是整数集,所以表示顺序并不重要

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))
现在我们需要重复这个过程,直到新的结果与之前的结果相同。流迭代器将设置重复,当每个元素与前一个元素不同时,我们将删除

// 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))

不漂亮,但可行。重新设计起始数据结构会更好。

如果使用的数据结构不正确,则应使用树instead@Mr你可能在寻找单词图,而不是一棵树。那么,用这种结构是不可能的?