浏览 1258 次
锁定老帖子 主题:根据依赖进行数据排序的示例
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-01-11
有个需求是进行多个js代码合并,js之间有互相依赖,依赖关系已经整理出,如
a depends on [b, d, e] e depends on [c] d depends on [c, e] ...
要做一个排序,一开始想,用个sort传个Comparator,比就可以了
ll.sort{a, b -> // 没有任何依赖的排前面 if(!depends[a]) return -1 if(!depends[b]) return 1
if(depends[a].contains(b)) return 1 if(depends[b].contains(a)) return -1
return 0 } 结果发现根本不是这么回事儿 默认快速排序,排到前面的,不会再和后面的继续比较
所以就写了下面的这些代码
def ll = [a, b, c, d, e] def depends = ... def rll = [] // 不依赖其他的排到前面 rll.addAll(ll.grep{!depends[it]}) // 依赖非本次排序的模块的拍到前面 rll.addAll(ll.grep{ def dLl = depends[it] dLl && dLl.every{one -> !ll.contains(one)} }) // 最多循环次数,防止死循环 int loopCount = ll.size() while(rll.size() != ll.size() && loopCount >= 0){ rll.addAll(ll.grep{ def dLl = depends[it].grep{one -> ll.contains(one) } // 排除已经在结果队列的 // 把依赖都已经在结果队列的排进入 !rll.contains(it) && dLl && dLl.every{one -> rll.contains(one)} }) loopCount-- } return rll
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |