有个需求是进行多个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